2013-08-13 7 views
11

Sto provando a leggere un file nella mia app di Windows 8 Store. Ecco un frammento di codice che utilizzo per raggiungere questo obiettivo:WinRT Non esiste alcuna mappatura per il carattere Unicode nella tabella codici multibyte di destinazione

 if(file != null) 
     { 
      var stream = await file.OpenAsync(FileAccessMode.Read); 
      var size = stream.Size; 
      using(var inputStream = stream.GetInputStreamAt(0)) 
      { 
       DataReader dataReader = new DataReader(inputStream); 
       uint numbytes = await dataReader.LoadAsync((uint)size); 
       string text = dataReader.ReadString(numbytes); 
      } 
     } 

Tuttavia, un esibirci è gettato alla riga:

string text = dataReader.ReadString(numbytes); 

messaggio exeption:

No mapping for the Unicode character exists in the target multi-byte code page. 

Come si arriva da Questo?

+1

Insolito, non pensavo che WinRT gestisse ancora la codifica multi-byte. Indica tuttavia un file di testo che non è codificato correttamente. –

risposta

19

sono riuscito a leggere il file correttamente utilizzando approccio simile a suggerito da Dude:

 if(file != null) 
     { 
      IBuffer buffer = await FileIO.ReadBufferAsync(file); 
      DataReader reader = DataReader.FromBuffer(buffer); 
      byte[] fileContent = new byte[reader.UnconsumedBufferLength]; 
      reader.ReadBytes(fileContent); 
      string text = Encoding.UTF8.GetString(fileContent, 0, fileContent.Length); 
     } 

Può qualcuno si prega di elaborare, perché il mio approccio iniziale non ha fatto lavoro?

+0

Ha letto il blocco note che salva la codifica ASCII come "?" quando char è cinese. E provo 'Encoding.ASCII.GetString'. Può essere d'aiuto? – lindexi

+0

@lindexi La codifica ASCII non supporta i caratteri cinesi. Maggiori informazioni [qui] (https://en.wikipedia.org/wiki/ASCII) –

+0

@Mazur, thx, It's GBK.Io uso notepad save ascii ed è GBK. – lindexi

4

Prova a modificare di string text = dataReader.ReadString(numbytes):

dataReader.ReadBytes(stream); 
string text = Convert.ToBase64String(stream); 
Problemi correlati