Вопрос

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

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

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

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

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

Это было полезно?

Решение

Я бы рекомендовал 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, но не смешивайте и не сопоставляйте, это приведет к неприятностям.

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

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

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

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

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

Это может значительно облегчить вашу жизнь.

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

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

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

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

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

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

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

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

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

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