Обработка Юникода в C ++ - PullRequest
       45

Обработка Юникода в C ++

103 голосов
/ 11 сентября 2008

Какова лучшая практика обработки Unicode в C ++?

Ответы [ 9 ]

77 голосов
/ 11 сентября 2008
  • Используйте ICU для работы с вашими данными (или подобной библиотекой)
  • В вашем собственном хранилище данных убедитесь, что все хранится в той же кодировке
  • Убедитесь, что вы всегда используете свою библиотеку Unicode для таких рутинных задач, как длина строки, состояние заглавных букв и т. Д. Никогда не используйте стандартные встроенные библиотеки, такие как is_alpha, если только это не то определение, которое вам нужно.
  • Я не могу сказать этого достаточно: никогда не итерируйте по индексам string, если вы заботитесь о корректности, всегда используйте для этого свою библиотеку Unicode.
9 голосов
/ 21 ноября 2012

Если вам не нужна обратная совместимость с предыдущими стандартами C ++, текущий стандарт C ++ 11 имеет встроенную поддержку Unicode: http://www.open -std.org / JTC1 / SC22 / WG21 / docs / paper /2011/n3242.pdf

Таким образом, действительно лучшая практика для обработки Unicode в C ++ состоит в том, чтобы использовать встроенные средства для этого. Это не всегда возможно с более старыми базами кода, хотя стандарт в настоящее время так нов.

РЕДАКТИРОВАТЬ: Для пояснения, C ++ 11 поддерживает Unicode, поскольку теперь он поддерживает литералы Unicode и строки Unicode. Однако стандартная библиотека имеет только ограниченную поддержку для обработки и преобразования Unicode. Для ваших текущих потребностей этого может быть достаточно. Однако, если вам нужно выполнить большой объем работ прямо сейчас, вам все равно может понадобиться что-то вроде ICU для более глубокой обработки. Есть некоторые предложения , которые в настоящее время находятся в разработке , чтобы включить более надежную поддержку преобразования текста между различными кодировками. Я предполагаю (и надеюсь), что это будет частью следующего технического отчета .

8 голосов
/ 11 сентября 2008

Наша компания (и другие) используют библиотеку Internation Components для Unicode (ICU) с открытым исходным кодом, изначально разработанную Taligent.

Он обрабатывает строки, локали, преобразования, дату / время, сопоставление, преобразования и т.д. и др.

Начните с Руководства пользователя ICU

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

Вот контрольный список для программирования Windows:

  • Все строки, заключенные в _T ("моя строка")
  • Функции strlen () и т. Д. Заменены на _tcslen () и т. Д.
  • Используйте LPTSTR и LPCTSTR вместо char * и const char *
  • При запуске новых проектов в Dev Studio неукоснительно убедитесь, что в свойствах вашего проекта выбран параметр Юникод.
  • Для строк C ++ используйте std :: wstring вместо std :: string
3 голосов
/ 11 сентября 2008

Посмотри на Сравнение строк без учета регистра в C ++

На этот вопрос есть ссылка на документацию Microsoft по Unicode: http://msdn.microsoft.com/en-us/library/cc194799.aspx

Если вы посмотрите на левую часть навигации по MSDN рядом с этой статьей, вы найдете много информации, относящейся к функциям Юникода. Он является частью главы «Кодирование символов» (http://msdn.microsoft.com/en-us/library/cc194786.aspx)

Имеет следующие подразделы:

  • Модель кодовой страницы
  • Двухбайтовые наборы символов в Windows
  • Unicode
  • Проблемы совместимости в смешанных средах
  • Преобразование данных Unicode
  • Миграция программ для Windows в Unicode
  • Краткое описание
2 голосов
/ 12 марта 2012

Хотя это может быть не лучшим решением для всех, вы можете написать собственные подпрограммы C ++ UNICODE, если хотите!

Я только что закончил делать это за выходные. Я многому научился, хотя я не гарантирую, что он на 100% свободен от ошибок, я много тестировал, и, похоже, он работает правильно.

Мой код находится под новой лицензией BSD и может быть найден здесь:

http://code.google.com/p/netwidecc/downloads/list

Он называется WSUCONV и поставляется с примером программы main (), которая конвертирует между UTF-8, UTF-16 и Standard ASCII. Если вы выбросите основной код, у вас будет хорошая библиотека для чтения / записи UNICODE.

1 голос
/ 15 февраля 2013

Как уже было сказано выше, библиотека лучше всего подходит при использовании большой системы. Тем не менее, иногда вам захочется справиться с ситуацией самостоятельно (возможно, потому что библиотека будет использовать много ресурсов, как на микроконтроллере). В этом случае вам нужна простая библиотека, из которой вы можете скопировать части для того, что вам действительно нужно.

Пример кода Уиллоу Шлангера кажется хорошим (см. Его ответ для более подробной информации).

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

Вот список встроенных библиотек, которые кажутся приличными.

Встроенные библиотеки

0 голосов
/ 23 сентября 2016

Посмотрите рекомендации UTF-8 Everywhere

0 голосов
/ 11 сентября 2008
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...