Могу ли я хранить UTF8 в массиве символов C - PullRequest
0 голосов
/ 27 января 2020

Отслеживание
Может ли UTF-8 содержать нулевой байт?

Могу ли я безопасно хранить строку UTF8 в конце с нулем char *?

Я понимаю strlen() не вернет правильную информацию, поставить «сохранение», печать и «передачу» массива char, похоже, безопасно.

Ответы [ 2 ]

3 голосов
/ 27 января 2020

Да.

Так же, как с ASCII и аналогичными 8-битными кодировками до Unicode, вы не можете хранить символ NUL в такой строке (значение \u+0000 является кодовой точкой Unicode NUL, очень похоже на ASCII).

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

1 голос
/ 27 января 2020

В C 0 байт является ограничителем строки. Пока точка Unicode 0, U + 0000 отсутствует в строке Unicode, проблем нет.

Чтобы иметь возможность хранить 0 байтов в Unicode, можно использовать модифицированный UTF-8 которые преобразуют не только кодовые точки> = 128, но также и 0 в многобайтовую последовательность (для каждого ее байта установлен старший бит>> = 128). Это делается в java для некоторых API, таких как DataOutputStream.writeUTF. Он гарантирует, что вы можете передавать строки со встроенным 0.

Формально он больше не является UTF-8, поскольку UTF-8 требует кодировки кратчайшие . Также это возможно только при определении длины io strlen при распаковке в не-UTF-8.

Таким образом, наиболее выполнимое решение - не принимать U + 0000 в строках.

...