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? Еще один?
Ответы
Ответ 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, и это немного упростит, когда вам придется передавать строки в пользовательский интерфейс и из него.