utf 8 — c ++: как поддерживать суррогатные символы в utf8

У нас есть приложение, написанное в базовой кодировке utf-8, которое поддерживает BMP utf-8 (3 байта). Тем не менее, существует потребность в поддержке суррогатных пар.

Я где-то читал, что суррогатные символы не поддерживаются в utf-8. Это правда?

Если да, то какие шаги нужно сделать, чтобы мое приложение имело кодировку по умолчанию utf-16, а не utf-8?

У меня нет фрагмента кода, так как все приложение написано с учетом utf-8, а не суррогатных символов.

Какие элементы мне нужно изменить во всем коде, чтобы получить поддержку суррогатных пар в utf-8. Или изменив кодировку по умолчанию на UTF-16.

0

Решение

У нас есть приложение, написанное в базовой кодировке utf-8, которое поддерживает BMP utf-8 (3 байта).

Почему не весь репертуар Unicode (4 байта)? Почему ограничен только 3 байтами? 3 байта дают вам поддержку только для кодовых точек до U + FFFF. 4 байта дают вам поддержку дополнительных 1048576 кодовых точек, вплоть до U + 10FFFF.

Тем не менее, существует потребность в поддержке суррогатных пар.

Суррогатные пары применяются только к UTF-16, но не к UTF-8 или даже к UCS-2 (предшественнику к UTF-16).

Я где-то читал, что суррогатные символы не поддерживаются в utf-8. Это правда?

Кодовые точки, которые используются для кодирования суррогатов, могут быть физически закодированы в UTF-8, однако они зарезервированный по стандарту Unicode и запрещено использовать вне кодировки UTF-16. UTF-8 не нуждается в суррогатных парах, и любая декодированная строка Unicode, которая содержит суррогатные кодовые точки в ней, должна считаться деформированной.

Если да, то какие шаги нужно сделать, чтобы мое приложение имело кодировку по умолчанию utf-16, а не utf-8?

Мы не можем ответить на этот вопрос, поскольку вы не предоставили никакой информации о том, как настроен ваш проект, каким компилятором вы пользуетесь и т. Д.

Однако вам не нужно переключать приложение на UTF-16. Вам просто нужно обновить свой код для поддержки 4-байтовой кодировки UTF-8 и убедиться, что вы поддерживаете суррогатные пары при преобразовании 16-битных данных в UTF-8. Не ограничивайте себя U + FFFF как максимально возможной кодовой точкой. Unicode имеет гораздо больше кодовых точек, чем это.

Похоже, ваш код обрабатывает UCS-2 только при преобразовании данных в / из UTF-8. Просто обновите этот код для поддержки UTF-16 вместо UCS-2, и все будет в порядке.

3

Другие решения

У нас есть приложение, написанное в базовой кодировке utf-8, которое поддерживает BMP utf-8 (3 байта). Тем не менее, существует потребность в поддержке суррогатных пар.

Так что конвертируйте строки в кодировке utf-16 в utf-8. Документация здесь: http://www.cplusplus.com/reference/codecvt/codecvt_utf8_utf16/

Если да, то какие шаги нужно сделать, чтобы мое приложение имело кодировку по умолчанию utf-16, а не utf-8?

Неправильный вопрос Используйте UTF-8 для внутреннего использования.

Какие элементы мне нужно изменить во всем коде, чтобы получить поддержку суррогатных пар в utf-8. Или изменив кодировку по умолчанию на UTF-16.

Смотри выше. Преобразование UTF-16 в UTF-8 для входящих данных и преобразование обратно в UTF-16 исходящих при необходимости.

1

По вопросам рекламы [email protected]