2009-05-20 10 views
12

Chciałbym móc uzyskać tablicę znaków wszystkich drukowanych znaków w języku C#, czy ktoś wie, jak to zrobić?Jak uzyskać listę wszystkich znaków do wydrukowania w języku C#?

edit:

Przez druku Znaczy widoczne znaki europejskie, więc tak, umlauty, tyldy, akcenty itp

+0

definiowanie wydruku – AnthonyWJones

+0

Proszę określić „do druku” -.? masz na myśli tylko „znaki druku ASCII” (zgodnie z odpowiedzią ilivewithin r) czy chciałbyś dołączyć znaki akcentowane? –

+0

Zakładam, że przez druk mówimy o druku na papierze? Jeśli szukasz tylko ascii wyszukiwania http://www.asciitable.com jest jednym. Dla unicode charmap.exe jest oczywistą opcją. –

Odpowiedz

22

To daje listę wszystkich znaków, które nie są uznawane za znaki sterujące :

List<Char> printableChars = new List<char>(); 
for (int i = char.MinValue; i <= char.MaxValue; i++) 
{ 
    char c = Convert.ToChar(i); 
    if (!char.IsControl(c)) 
    { 
     printableChars.Add(c); 
    } 
} 

Możesz zbadać inne Char.IsXxxx sposobów, aby znaleźć kombinację, która odpowiada Twoim wymaganiom.

+0

Z tego powodu nie rozumiem, jeśli to zrobisz: for (char c = char.MinValue; c <= char.MaxValue; C++) OutOfMemoryException - lista zapełnia się szybko –

+0

Wygląda na to, że instrukcja C++ powoduje, że licznik jest zawijany do 0 po 65535, co oznacza, że ​​c <= char.MaxValue zawsze będzie prawdziwe. Wartość int może zawierać większe wartości, więc zwiększa wartość beyound char.MaxValue, a warunek wyjścia jest spełniony, a pętla zatrzymuje się. –

+0

(Czasami chciałbym, aby komentarze były edytowane, aby te denerwujące błędy ortograficzne mogły zostać usunięte ...) –

3

rozwiązanie LINQ (na podstawie Fredrik Mörk'S):

Enumerable.Range(char.MinValue, char.MaxValue).Select(c => (char)c).Where(
    c => !char.IsControl(c)).ToArray(); 
+0

Czy próbowałeś skompilować/uruchomić to? :) –

+0

Ups, potrzebuję obsady tam. Twoje zdrowie. – Noldorin

+0

Nie będzie działać od wersji 3.5SP1. Zobacz moją odpowiedź. –

18

Oto wersja LINQ roztworu Fredrik użytkownika. Zauważ, że Enumerable.Range daje IEnumerable<int>, więc musisz najpierw przekonwertować na znaki. Cast<char> będzie pracował w 3.5SP0 wierzę, ale jak 3.5SP1 trzeba zrobić „właściwego” konwersja:

var chars = Enumerable.Range(0, char.MaxValue+1) 
         .Select(i => (char) i) 
         .Where(c => !char.IsControl(c)) 
         .ToArray(); 

Utworzyłem wynik jako tablicę jako że to właśnie pytanie zadane za - to niekoniecznie najlepszy pomysł. To zależy od przypadku użycia.

Należy zauważyć, że nie uwzględnia to również pełnych znaków Unicode, tylko te w podstawowej płaszczyźnie wielojęzycznej. Nie wiem, co zwraca dla surogatów wysokich/niskich, ale warto przynajmniej wiedzieć, że pojedynczy char tak naprawdę nie pozwala ci reprezentować wszystkiego :(

+0

Naprawdę muszę zagłębić się w te rzeczy Linqa, są tam pewne eleganckie rozwiązania: o) –

+0

Cholera, więc pokonałem Jona Skeeta, a moja odpowiedź wciąż przegrywa. :(Tak jak w notatce: Możesz zastąpić to Wybierz połączenie rzutem, aby było odrobinę milsze – Noldorin

+1

Downvoters, podaj powody. (Zauważ, że chociaż jest to podobne do odpowiedzi Noldorina, wierzę, że daje więcej informacji - i to działa :) –

0

Wiem, że ASCII nie było specjalnie wymagane, ale jest to . szybki sposób uzyskać listę wszystkich znaków ASCII

for (Int32 i = 0x20; i <= 0x7e; i++) 
{ 
    printableChars.Add(Convert.ToChar(i)); 
} 

Zobacz ten ASCII table

0
public bool IsPrintableASCII(char c) 
{ 
    return c >= '\x20' && c <= '\x7e'; 
} 
+1

Dodaj wyjaśnienie w odpowiedzi na pytanie, w jaki sposób ta odpowiedź pomoże OP w ustalaniu bieżącego problemu –

Powiązane problemy