2012-11-29 18 views
5

ho una stringa di input nel sistema di codifica alieno, vale a dire: "\\U+1043\\U+1072\\U+1073\\U+1072\\U+1088\\U+1080\\U+1090\\U+1085\\U+1086\\U+1089\\U+1090\\U+1100"determinare il tipo di codice testo e gettato per difetto

E voglio lanciare al mio sistema di codice di default (System.Text.Encoding.Default):

-  System.Text.Encoding.Default {System.Text.SBCSCodePageEncoding} System.Text.Encoding {System.Text.SBCSCodePageEncoding} 
+  [System.Text.SBCSCodePageEncoding] {System.Text.SBCSCodePageEncoding} System.Text.SBCSCodePageEncoding 
     BodyName "koi8-r" string 
     CodePage 1251 int 
+  DecoderFallback {System.Text.InternalDecoderBestFitFallback} System.Text.DecoderFallback {System.Text.InternalDecoderBestFitFallback} 
+  EncoderFallback {System.Text.InternalEncoderBestFitFallback} System.Text.EncoderFallback {System.Text.InternalEncoderBestFitFallback} 
     EncodingName "Cyrillic (Windows)" string 
     HeaderName "windows-1251" string 
     IsBrowserDisplay true bool 
     IsBrowserSave true bool 
     IsMailNewsDisplay true bool 
     IsMailNewsSave true bool 
     IsReadOnly true bool 
     IsSingleByte true bool 
     WebName "windows-1251" string 
     WindowsCodePage 1251 int 

Come è possibile determinare il sistema di codice e come eseguirlo?

+0

sai cosa deve contenere il file o parte del file dopo una conversione riuscita? – Jodrell

+0

di alien, intendi qualche altra codifica sconosciuta – Jodrell

+0

> di alien, vuoi dire qualche altra codifica sconosciuta sì – psct

risposta

11

Non sono sicuro di capire davvero la tua domanda.

In .NET, quando si dispone di un oggetto stringa, non è necessario preoccuparsi di codifiche diverse. Tutte le stringhe .NET utilizzano la stessa codifica: Unicode (o più precisamente: UTF-16).

Le codifiche di testo diverse entrano in gioco solo quando si ruota un oggetto stringa in una sequenza di byte (ad esempio per scriverlo in un file di testo) o viceversa. Presumo che tu stia parlando di questo. Per convertire una sequenza di byte da una codifica a un altro, si potrebbe scrivere:

byte[] input = ReadInput(); // e.g. from a file 
Encoding decoder = Encoding.GetEncoding("encoding of input"); 
string str = decoder.GetString(input); 
Encoding encoder = Encoding.GetEncoding("encoding of output"); 
byte[] ouput = encoder.GetBytes(str); 

Naturalmente è necessario sostituire encoding of input e encoding of output con i nomi di codifica corretta. MSDN ha un list of all supported encodings.

È necessario conoscere la codifica dell'input, per convenzione o in base ai metadati o qualcosa del genere. Non puoi determinare/indovinare in modo affidabile una codifica sconosciuta, ma ci sono alcuni trucchi ed euristiche che potresti applicare. Vedi How can I detect the encoding/codepage of a text file.

Edit:

"U + xxxx" è come di solito si fa riferimento a uno specifico punto di codice Unicode (il numero assegnato a un carattere Unicode), ad esempio, il punto di codice della lettera "A" (capitale latino A) è U + 0041.

La stringa di input è effettivamente "\\U+1043..." (backslash, barra rovesciata, maiuscola U, ecc.) Oppure è visualizzata solo in questo modo, ad es. in una finestra del debugger? Se è il primo, qualcuno ha commesso un errore durante la codifica del testo, magari tentando di scrivere un letterale Unicode e accidentalmente sfuggire al backslash scrivendo un secondo (Edit2: oppure i caratteri sono stati deliberatamente salvati in modo escape per scriverli in un file/stream codificato in ASCII/ecc.). Per quanto ne so, le classi di codifica .NET non ti aiutano qui; è necessario analizzare la stringa a mano.

A proposito, i numeri nell'esempio sono strani. Nella notazione standard, il numero dopo "U +" è un numero esadecimale, non un numero decimale. Ma se si leggono i punti del codice come numeri esadecimali si riferiscono a personaggi di sistemi di script completamente indipendenti (Burmese, Mkhedruli georgiano, Hangul Jamo); leggere come numeri decimali si riferiscono tutti a lettere cirilliche, però.

Edit3: di analizzarlo, bene, cercare sottostringhe in forma \\U+xxxx (con x essere una cifra), convertire xxxx ad un int n, creare un char con quel punto di codice (Char.ConvertFromUtf32(n)) e sostituire l'intero sottostringa di quel carattere.

+0

ok, l'ho pensato, grazie. – psct

+0

scusa, ma non ho potuto risolvere il problema. Si scrive che UTF-16 è la codifica predefinita su .Net ma perché System.Text.Encoding.Default è koi8-r? O usato solo per stringhe non .Net e poi convertirlo in utf-16? Quindi, ho problemi con la codifica determinata alla stringa "\\ U + 1043 ...", puoi aiutarmi per favore (ho provato cp1251, utf-8/16, koi8-r e molti altri in emacs ma non ho potuto trovato adatto)? – psct

+1

@psct: No, UTF-16 non è la codifica predefinita, è la codifica interna delle stringhe .NET. La codifica predefinita dipende dalle impostazioni di cultura del tuo sistema. –

Problemi correlati