2016-04-20 35 views
6

Ho UTF8 byte[] di dimensioni infinite (ad esempio di dimensioni molto grandi). Voglio troncarlo solo ai byte 1024 e quindi convertirlo in stringa.byte UTF8 [] per conversione stringhe

Encoding.UTF8.GetString(byte[], int, int) lo fa per me. Riduce prima i byte 1024 e quindi mi fornisce la stringa convertita.

Ma in questa conversione, se l'ultimo carattere è del set di caratteri UTF8, che è composto da 2 byte e il cui primo byte rientra nell'intervallo e un altro byte è fuori intervallo, visualizza ? per quel carattere nella stringa convertita.

C'è qualche modo in modo che questo ? non venga nella stringa convertita?

risposta

6

Ecco a cosa serve la classe Decoder. Esso consente di flusso di dati byte in dati char, pur mantenendo abbastanza Stato per gestire code-punti parziali correttamente:

Encoding.UTF8.GetDecoder().GetChars(buffer, 0, 1024, charBuffer, 0) 

Naturalmente, quando il codice-punto è diviso a metà, il Decoder è lasciato con un "char parziale" nel suo stato, ma questo non ti riguarda nel tuo caso (ed è auspicabile in tutti gli altri casi d'uso :)).

+0

Non so come gestire i puntatori. Qualche aiuto o alternativa alla tua soluzione? – pratik03

+0

@ pratik03 Nessun puntatore interessato: basta usare il sovraccarico 'char []' (e 'byte []') invece del sovraccarico 'char *' (e 'byte *'). – Luaan