парсинг строки utf8 из ответа сервера

0

Я реализовал приложение на каком-то устройстве, которое занималось отправкой данных с сервера. Данные с сервера обычно бывают в форме:

"1;username;someInteger;"

Анализ был простым, и я использовал strtok как вы можете себе представить, чтобы получить отдельные значения из этой строки, такие как: 1, username и someInteger.

Но теперь может возникнуть ситуация, когда сервер отправит мне строку unicode в качестве username.

Я думаю, хорошая идея - использовать имя пользователя, закодированное как строка UTF-8 (правильно?). Что вы рекомендуете - как следует разбирать его из строки? Какой символ использовать как разделитель, например (например, вместо ";") или какие функции использовать для извлечения имени username из строки выше?

поскольку это какое-то встроенное устройство, я хочу избежать установки там некоторых сторонних библиотек (что может быть даже невозможно), поэтому более "чистые" способы были бы более желательными.

  • 0
    Избегайте strtok . Это не потокобезопасно. Вместо этого используйте boost::split .
  • 1
    @rightfold Избегайте boost для простой замены strtok() . Это слишком большое. Используйте strtok_r() .
Показать ещё 3 комментария
Теги:

2 ответа

4
Лучший ответ

Персонаж ';' то же самое в UTF-8, как и в ASCII, поскольку 127 первых символов в обоих кодировках одинаковы. Это означает, что вы все еще можете использовать strtok для разделения на ';' ,

  • 0
    Я слышал, что strtok может "остановиться", если между ними встречается "завершающий нулевой символ" - не может ли быть так, что строка Unicode содержит несколько символов между двумя разделителями (;), что strtok будет интерпретировать как нулевой завершающий символ?
  • 2
    @dmcr_code no, многобайтовые последовательности содержат только байты со значениями> = 128 (или <0, в зависимости от подписи символа), поэтому любой байт ASCII является точкой кода ASCII. Там нет кодовой точки, кроме нулевого символа, который содержит нулевой байт (см. stackoverflow .com / questions / 6907297 / can-utf-8-содержать нулевой байт ). Другими слова: если strtok встречает нулевые байты, то нулевой ограничитель и ничего другого. То же самое относится к любому другому значению ASCII:
Показать ещё 4 комментария
0

Сама вещь с UTF8 заключается в том, что вам практически ничего не нужно делать. Символы ASCII по-прежнему кодируются как те же ASCII-байты, что и всегда, поэтому, если вы просто продолжаете использовать разделители с запятой, вам вообще не нужно ничего делать.

  • 0
    Я думаю, что strtok может остановиться, если между ними встречается «нулевой завершающий символ» - не может ли быть так, что строка Unicode содержит несколько символов между двумя разделителями (;), что strtok будет интерпретировать как нулевой завершающий символ?
  • 0
    Нет: единственный "нулевой завершающий символ" - это ASCII 0, он же NUL. Ни одна кодировка UTF-8 не содержит каких-либо символов NUL, кроме как для самого NUL, что, опять же, так же, как и в обычном ASCII.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню