Строки C ++: UTF-8 или 16-битная кодировка? - PullRequest
12 голосов
/ 19 сентября 2008

Я все еще пытаюсь решить, должен ли мой (домашний) проект использовать строки UTF-8 (реализованные в терминах std :: string с дополнительными функциями, специфичными для UTF-8 при необходимости), или некоторые 16-битная строка (реализовано как std :: wstring). Проект представляет собой язык программирования и среду (например, VB, это комбинация обоих).

Есть несколько желаний / ограничений:

  • Было бы здорово, если бы он мог работать на ограниченном оборудовании, например на компьютерах с ограниченной памятью.
  • Я хочу, чтобы код работал на Windows, Mac и (если позволяют ресурсы) Linux.
  • Я буду использовать wxWidgets в качестве уровня GUI, но я хочу, чтобы код, взаимодействующий с этим инструментарием, находился в углу кодовой базы (у меня будут исполняемые файлы без графического интерфейса).
  • Я бы хотел избежать работы с двумя различными типами строк при работе с видимым пользователем текстом и данными приложения.

В настоящее время я работаю с std :: string с намерением использовать функции манипуляции UTF-8 только при необходимости. Это требует меньше памяти, и, похоже, это направление, в котором многие приложения работают в любом случае.

Если вы рекомендуете 16-битную кодировку, какую: UTF-16 ? UCS-2 ? Еще один?

Ответы [ 8 ]

26 голосов
/ 19 сентября 2008

UTF-16 по-прежнему является символьной кодировкой переменной длины (существует более 2 ^ 16 кодовых точек Юникода), поэтому вы не можете выполнять O (1) операций индексации строк. Если вы делаете много такого рода вещей, вы ничего не экономите в скорости по сравнению с UTF-8. С другой стороны, если ваш текст содержит много кодовых точек в диапазоне 256-65535, UTF-16 может существенно улучшить размер. UCS-2 - это вариант UTF-16, который равен фиксированной длины, за счет запрета любых кодовых точек больше 2 ^ 16.

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

6 голосов
/ 19 сентября 2008

Я никогда не находил причин использовать что-то еще, кроме UTF-8, чтобы быть честным.

5 голосов
/ 19 сентября 2008

Если вы решили использовать кодировку UTF-8, проверьте эту библиотеку: http://utfcpp.sourceforge.net/

Это может сделать вашу жизнь намного проще.

4 голосов
/ 22 сентября 2008

Я на самом деле написал широко используемое приложение (более 5 миллионов пользователей), поэтому каждый используемый килобайт буквально складывается. Несмотря на это, я просто придерживался wxString. Я настроил его для получения из std :: wstring, чтобы я мог передать их функциям, ожидающим wstring const &.

Обратите внимание, что std :: wstring является нативным Unicode на Mac (для символов выше U + 10000 не требуется UTF-16), поэтому он использует 4 байта / wchar_t. Большим преимуществом этого является то, что i ++ всегда дает вам следующий символ. На Win32 это верно только в 99,9% случаев. Как программист, вы поймете, насколько мало 99,9%.

Но если вы не уверены, напишите функцию в верхнем регистре: std :: string [UTF-8] и std :: wstring. Эти две функции скажут вам, какой путь - безумие.

Ваш формат на диске - другое дело. Для переносимости это должно быть UTF-8. В UTF-8 нет проблем с порядком байтов, и не обсуждается вопрос о ширине (2/4). Возможно, поэтому многие программы используют UTF-8.

На немного не связанной ноте, пожалуйста, ознакомьтесь со сравнениями и нормализацией строк Unicode. Или вы получите ту же ошибку, что и в .NET, где у вас могут быть две переменные föö и föö, отличающиеся только (невидимой) нормализацией.

2 голосов
/ 19 сентября 2008

MicroATX в значительной степени является стандартным форматом материнской платы для ПК, наиболее способным к 4-8 ГБ оперативной памяти. Если вы говорите о PicoATX, возможно, вы ограничены 1-2 ГБ ОЗУ. Даже тогда этого достаточно для среды разработки. Я бы по-прежнему придерживался UTF-8 по причинам, упомянутым выше, но память не должна вас беспокоить.

2 голосов
/ 19 сентября 2008

Я бы порекомендовал UTF-16 для любого вида манипуляций с данными и пользовательского интерфейса. В Mac OS X и Win32 API используется UTF-16, то же самое для wxWidgets, Qt, ICU, Xerces и других. UTF-8 может быть лучше для обмена данными и хранения. Смотри http://unicode.org/notes/tn12/.

Но что бы вы ни выбрали, я бы определенно рекомендовал использовать std :: string с UTF-8 «только при необходимости».

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

1 голос
/ 19 сентября 2008

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

Я бы тоже посмотрел на ICU . Если вы не собираетесь использовать определенные функции строк в STL, лучше использовать типы строк ICU.

0 голосов
/ 19 сентября 2008

Рассматривали ли вы использовать wxStrings? Если я правильно помню, они могут выполнять UTF-8 <-> Unicode-преобразования, и это будет немного проще, когда вам придется передавать строки в и из пользовательского интерфейса.

...