2008-09-19 1 views
12

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

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

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

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

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

+1

Micro ATX не означает ограниченную память. Мой компьютер дома находится на (Micro-ATX) ASUS M2A-VM, и он отлично работает с Crysis. – notJim 2010-08-23 23:09:55

+0

Я отредактировал вопрос, чтобы удалить ошибку. – 2011-08-12 12:49:56

ответ

2

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

+1

Программист Mac моей команды говорит, что wchar_t - 32 бита. И в нашей кодовой базе есть много кода, который нарушал бы иначе. – MSalters 2008-09-21 23:12:46

+0

Просто уточнить: с помощью «utf-8 только при необходимости» я на самом деле имел в виду, что я буду использовать некоторые функции манипуляции utf-8 только тогда, когда мне действительно нужно иметь дело с символами, но все строки всегда были бы utf-8 , – 2008-09-23 10:25:14

1

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

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

+0

Собственно, UTF-16 будет соответствовать большинству символов живого языка в двух байтах; взгляните на [кодовые диаграммы] [http://unicode.org/charts/PDF/] для кодовых пунктов выше U + 10000; все они являются древнегреческими или римскими символами. – 2008-09-19 20:43:08

+0

Ben Straub: Спасибо. Исправлено в моем сообщении – Branan 2008-09-20 01:02:09

6

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

2

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

26

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

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

0

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

5

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

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

4

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

Обратите внимание: std :: wstring является родным Unicode на 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.

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

Смежные вопросы