2016-04-20 20 views
6

Mam UTF8 o nieskończonym rozmiarze (tj. O bardzo dużym rozmiarze). Chcę go przyciąć do 1024 tylko bajtów, a następnie przekonwertować na ciąg.UTF8 bajt [] do konwersji ciągów znaków

Encoding.UTF8.GetString(byte[], int, int) robi to dla mnie. Najpierw skraca on bajty o 1024, a następnie przekazuje mi skonwertowany ciąg znaków.

Jednak w tej konwersji, jeśli ostatni znak ma zestaw znaków UTF8, który składa się z 2 bajtów i którego pierwszy bajt mieści się w zakresie, a inny bajt jest poza zakresem, wówczas wyświetla on znak ? dla tego znaku w skonwertowanym łańcuchu.

Czy jest jakiś sposób, aby ten ? nie został przekształcony w ciąg znaków?

Odpowiedz

6

Do tego służy klasa Decoder. To pozwala strumieniowo byte danych do char danych, przy jednoczesnym zachowaniu wystarczającej stan obsłużyć częściowe kodowe punktów poprawnie:

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

Oczywiście, gdy kod punkt jest podzielony w środku, Decoder pozostało z "partial char" w swoim stanie, ale to nie dotyczy ciebie w twoim przypadku (i jest pożądane we wszystkich innych przypadkach użycia :)).

+0

Nie wiem, jak radzić sobie ze wskaźnikami. Jakąkolwiek pomoc lub alternatywę swojego rozwiązania? – pratik03

+0

@ pratik03 Brak odnośników - po prostu użyj przeciążenia 'char []' (i 'byte []') zamiast przeciążenia 'char *' (i 'byte *'). – Luaan