Вопрос

В чем разница между UTF и UCS?

Каковы наилучшие способы представления неевропейских наборов символов (с использованием UTF) в строках C ++?Я хотел бы узнать ваши рекомендации по:

  • Внутреннее представление внутри кода
    • Для манипулирования строками во время выполнения
    • Для использования строки в целях отображения.
  • Наилучшее представление хранилища (т. е. В файле)
  • Наилучший формат передачи по проводам (передача между приложениями, которые могут быть на разных архитектурах и иметь разную стандартную локаль)
Это было полезно?

Решение

В чем разница между UTF и UCS?

Кодировки UCS имеют фиксированную ширину и обозначаются количеством байт, используемых для каждого символа.Например, для UCS-2 требуется 2 байта на символ.Символы с кодовыми точками за пределами доступного диапазона не могут быть закодированы в кодировке UCS.

Кодировки UTF имеют переменную ширину и отмечены минимальным количеством битов для хранения символа.Например, UTF-16 требует не менее 16 бит (2 байта) на символ.Символы с большими кодовыми точками кодируются с использованием большего количества байт - 4 байта для символов astral в UTF-16.

  • Внутреннее представление внутри кода
  • Наилучшее представление хранилища (т. е.В файле)
  • Лучший формат передачи по проводам (передача между приложениями, которые могут быть на разных архитектурах и иметь разную стандартную локаль)

Для современных систем наиболее разумной кодировкой хранения и транспортировки является UTF-8.Существуют особые случаи, когда могут подойти другие -- UTF-7 для старых почтовых серверов, UTF-16 для плохо написанных текстовых редакторов, но UTF-8 является наиболее распространенным.

Предпочтительное внутреннее представление будет зависеть от вашей платформы.В Windows это UTF-16.В UNIX это UCS-4.У каждого из них есть свои положительные стороны:

  • Строки UTF-16 никогда не используют больше памяти, чем строка UCS-4.Если вы храните много больших строк с символами в основном в базовой многоязычной плоскости (BMP), UTF-16 потребует гораздо меньше места, чем UCS-4.За пределами BMP он будет использовать то же количество.
  • О UCS-4 рассуждать легче.Поскольку символы UTF-16 могут быть разделены на несколько "суррогатных пар", корректно разделить или отобразить строку может быть непросто.В тексте UCS-4 этой проблемы нет.UCS-4 также действует во многом подобно тексту ASCII в массивах "char", поэтому существующие текстовые алгоритмы могут быть легко перенесены.

Наконец, некоторые системы используют UTF-8 в качестве внутреннего формата.Это полезно, если вам нужно взаимодействовать с существующими системами на основе ASCII или ISO-8859, потому что нулевые байты не присутствуют в середине текста UTF-8 - они находятся в UTF-16 или UCS-4.

Другие советы

Я бы предложил:

  • Для представления в коде, wchar_t или эквивалент.
  • Для представления в хранилище используется UTF-8.
  • Для проводного представления используйте UTF-8.

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

UTC - это Всемирное координированное время, а не набор символов (я не нашел ни одной кодировки с названием UTC).

Для внутреннего представления вы можете захотеть использовать wchar_t для каждого символа и std::wstring для строк.Они используют ровно 2 байта для каждого символа, поэтому поиск и произвольный доступ будут быстрыми.

Для хранения, если большая часть данных не является ASCII (т. е.код >= 128), возможно, вы захотите использовать UTF-16, который почти такой же, как сериализованный wstring и wchar_t.

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

Во внутреннем представлении внутри кода вам лучше сделать это как для европейских, так и для неевропейских символов:

\uNNNN

Символы в диапазоне от \u0020 до \u007E и немного пробелов (напримерконец строки) может быть записан обычными символами.Все, что выше \u0080, если вы напишете это как обычный символ, то оно будет скомпилировано только на вашей кодовой странице (напримерХОРОШО во Франции, но ломается в России, хорошо в России, но ломается в Японии, хорошо в Китае, но ломается в США и т.д.).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top