2013-03-04 12 views
5

Istnieje chiński znak przedstawiony w UTF-8 jako F0 A4 AD A2. Ta postać jest opisana tutaj: http://en.wikipedia.org/wiki/UTF-8C#: bajty na konwersję ciągów UTF-8. Dlaczego to nie działa?

U + 24B62 F0 A4 AD A2

Kiedy uruchomić ten kod w C#...

byte[] data = { 0xF0, 0xA4, 0xAD, 0xA2 }; 
string abc = Encoding.UTF8.GetString(data); 
Console.WriteLine("Test: description = {0}", abc); 

... I przekierować wyjście do plik tekstowy, a następnie otwórz go przy pomocy notepad.exe, wybierając kodowanie UTF-8. Spodziewam się uzyskać wynik, ale otrzymuję dwa znaki zapytania (??).

Sekwencja bajtów ma rację. Działa w Perlu:

print "\xF0\xA4\xAD\xA2"; 

W wyjściu otrzymuję

Więc moje pytanie brzmi: dlaczego mam „??” zamiast "" w C#?

P.S. Nic specjalnego z tą postacią: Mam to samo dla każdej postaci (2, 3 lub 4 bajty).

+2

W przypadku Perl, by „na wyjściu” masz na myśli przekierować dane wyjściowe do pliku tekstowego i otwórz go w notatniku? – yoozer8

+0

Musisz upewnić się, że piszesz do pliku przy użyciu kodowania UTF8. Czy możesz umieścić kod do zapisu w pliku? –

+0

Jakiś konkretny powód, dla którego nie możesz korzystać z plików? Konsola i Unicode są nieco bolesne. Oleksandr Pshenychnyy odpowiedź (+1) może ci w tym pomóc ... –

Odpowiedz

3

Musisz napisać do pliku przy użyciu UTF8. Poniższy kod pokazuje, jak możesz to zrobić. Podczas otwierania wynikowy plik w Notatniku, postać jest pokazana poprawnie:

string c = ""; 
var bytes = Encoding.UTF8.GetBytes(c); 
var cBack = Encoding.UTF8.GetString(bytes); 
using (var writer = new StreamWriter(@"c:\temp\char.txt", false, Encoding.UTF8)) 
{ 
    writer.WriteLine(cBack); 
} 
+0

Jakob, dzięki, pomogło! – Racoon

+0

@Racoon: Cieszę się, że mogę pomóc :-) –

+0

Jak to zrobić z konsolą? – Paul

13

Konsola nie może domyślnie wyświetlać znaków Unicode. Wyświetla tylko ASCII. Aby włączyć wyświetlanie Unicode, użyj:

Console.OutputEncoding = System.Text.Encoding.Unicode 

przed napisaniem do niego.

Ale mimo to zawiedzie na większości OS, ponieważ wiersz poleceń systemu Windows nie obsługuje samego Unicode.

Tak więc, dla celów testowania lepiej byłoby napisać wyjście do pliku

+0

Jeśli możliwe jest ustawienie kodowania w aplikacji konsoli, powinno być możliwe ustawienie kodowania po uruchomieniu wiersza polecenia. Nie zgadzam się z tym, że wynik powinien zostać przekierowany do pliku oczywiście. –

+1

To polecenie generuje wyjątek: Generic Exception Handler: System.IO.IOException: Parametr jest niepoprawny. w System.IO .__ Error.WinIOError (Int32 errorCode ciąg maybeFullPath) w System.IO .__ Error.WinIOError() w System.Console.set_OutputEncoding (wartość kodowania) w tpam_multibyte.Program.Main (ciąg [] args) – Racoon

+0

Jak już powiedziałem, to się nie powiedzie w systemie Windows (przynajmniej w Windows 7), ponieważ konsola Windows nie obsługuje Unicode. Właśnie dlatego otrzymujesz ten błąd –