2013-03-04 5 views
5

C'è un carattere cinese che viene presentato in UTF-8 come F0 A4 AD A2. Questo personaggio è descritto qui: http://en.wikipedia.org/wiki/UTF-8C#: conversione da stringa a byte UTF-8. Perché non funziona?

U + 24B62 F0 A4 AD A2

Quando eseguo questo codice in C# ...

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

... ho reindirizzare l'output al file di testo e quindi aprirlo con notepad.exe scegliendo la codifica UTF-8. Mi aspetto di ottenere l'output, ma ottengo due punti interrogativi (??).

La sequenza di byte è corretta. Funziona in Perl:

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

In uscita, ottengo

Quindi la mia domanda è: perché ottengo "??" invece di "" in C#?

P.S. Niente di speciale con questo personaggio: ho ottenuto la stessa cosa per qualsiasi personaggio (lungo 2, 3 o 4 byte).

+2

Nel caso Perl, da "in uscita" vuoi dire di reindirizzare l'output in un file di testo e aprirlo con il Blocco note? – yoozer8

+0

È necessario assicurarsi di scrivere sul file usando la codifica UTF8. Puoi pubblicare il codice per scrivere nel file? –

+0

Qualche ragione particolare per cui non è possibile utilizzare i file? Console e Unicode sono piuttosto dolorose da gestire. La risposta di Oleksandr Pshenychnyy (+1) può aiutarti in questo caso ... –

risposta

3

Hai bisogno di scrivere in un file utilizzando UTF8. Il codice qui sotto mostra come puoi farlo. Quando si apre il file risultante in Blocco note, il carattere viene visualizzato correttamente:

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, grazie, ha aiutato! – Racoon

+0

@Racoon: Sono contento di poter aiutare :-) –

+0

Come fare questo con la console? – Paul

13

La console non può visualizzare i caratteri Unicode per impostazione predefinita. Visualizza solo ASCII. Per abilitarlo visualizzare Unicode, utilizzare:

Console.OutputEncoding = System.Text.Encoding.Unicode 

prima di scriverci.

Ma in ogni caso non funzionerà sulla maggior parte degli OS, perché la riga di comando di Windows non supporta Unicode stesso.

Così, a scopo di test sarebbe meglio scrivere di output su file

+0

Se è possibile impostare la codifica su un'applicazione console, dovrebbe essere possibile impostare la codifica quando viene lanciato un prompt dei comandi. Non sono d'accordo sul fatto che l'output debba essere reindirizzato a un file, ovviamente. –

+1

Questo comando produce un'eccezione: Generic Exception Handler: System.IO.IOException: il parametro non è corretto. a System.IO .__ Error.WinIOError (Int32 errorCode, String maybeFullPath) a System.IO .__ Error.WinIOError() al System.Console.set_OutputEncoding (valore Encoding) a tpam_multibyte.Program.Main (String [] args) – Racoon

+0

Come ho detto, non funzionerà con il sistema operativo Windows (almeno fino a Windows 7), perché la console Windows non supporta l'Unicode. Ecco perché ricevi questo errore –