Piszę parsera JSON w C++ i jestem w obliczu problemu podczas analizowania ciągów JSON:Jak obsługiwać wartości Unicode w ciągach JSON?
Specyfikacja JSON stwierdza, że ciągi JSON może zawierać znaki Unicode w postaci:
"here comes a unicode character: \u05d9 !"
My JSON parser próbuje odwzorować łańcuchy JSON na std::string
, więc zazwyczaj jeden znak ciągów JSON staje się jednym znakiem std::string
. Jednak dla tych znaków Unicode, ja naprawdę nie wiem, co robić:
Czy mogę po prostu położyć surowe wartości bajtów w moim std::string
tak:
std::string mystr;
mystr.push_back('\0x05');
mystr.push_back('\0xd9');
Albo należy interpretować dwa znaki z biblioteka taka jak iconv
i zamiast tego zapisuje wynik zakodowany w UTF-8 w moim ciągu?
Czy należy używać std::wstring
do przechowywania wszystkich znaków? Co wtedy w systemach * NIX, gdzie wchar_t
ma 4 bajty?
Czuję, że coś jest nie tak w moich rozwiązaniach, ale nie rozumiem co. Co powinienem zrobić w tej sytuacji?
Jeśli wchar_t ma długość 4 bajtów, można po prostu zerować ... Ponadto UTF-8 nie oznacza znaków 8-bitowych. Dane spoza zestawu ASCII będą również przechowywane w wielu bajtach w kodowaniu UTF-8. –
@ H2CO3: Oczywiście. http://json.org stwierdza, że ciąg * może zawierać ** dowolny znak UNICODE **, ale nie mówi, czy te ciągi znaków są kodowane w UTF-8 czy UTF-16. Wydaje mi się, że jest to kodowanie UTF-8 ze specjalną reprezentacją dla znaków UTF-16. Jednym z celów mojego pytania jest również zapewnienie tego. – ereOn
Nie ma czegoś takiego jak "znaki UTF-16". Istnieją znaki Unicode, które nie są częścią ASCII, i są kodowane przy użyciu wielu bajtów również w UTF-8, UTF-16 i UTF-32. Ciągi złożone z wielobajtowych ciągów znaków w UTF-16 i UTF-32 są wygodne, aby wszystkie postaci miały taką samą długość. –