Подтвердить что ты не робот

C++ строки: UTF-8 или 16-битное кодирование?

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

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

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

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

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

Ответ 6

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

Ответ 7

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

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

Ответ 8

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