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

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

Ответ 1

  • Используйте ICU для работы с вашими данными (или подобной библиотекой)
  • В вашем собственном хранилище данных убедитесь, что все хранится в той же кодировке
  • Убедитесь, что вы всегда используете свою библиотеку юникода для выполнения обычных задач, таких как длина строки, статус капитализации и т.д. Никогда не используйте стандартные встроенные библиотеки, такие как is_alpha, если это не то определение, которое вы хотите.
  • Я не могу сказать этого достаточно: никогда не перебирать индексы string, если вы заботитесь о правильности, всегда используйте вашу библиотеку unicode для этого.

Ответ 2

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

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

Начните с ICU Userguide

Ответ 3

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

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

EDIT: Чтобы уточнить, С++ 11 поддерживает Unicode, поскольку теперь он поддерживает литералы Unicode и строки Unicode. Тем не менее, стандартная библиотека имеет только ограниченную поддержку для обработки и преобразования в Юникоде. Для ваших текущих потребностей этого может быть достаточно. Однако, если вам нужно сделать большой объем тяжелого подъема прямо сейчас, вам может понадобиться использовать что-то вроде ICU для более подробной информации, обработки глубины. В настоящее время есть несколько предложений чтобы включить более надежную поддержку для преобразования текста между различными кодировками. Моя догадка (и надежда) заключается в том, что это будет частью следующего технического отчета.

Ответ 4

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

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

Ответ 5

Посмотрите Неверное сравнение строк в С++

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

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

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

  • Модель кодовой страницы
  • Двухбайтовые наборы символов в Windows
  • Unicode
  • Проблемы совместимости в смешанных средах
  • Unicode Data Conversion
  • Миграция программ на базе Windows в Unicode
  • Резюме

Ответ 6

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

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

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

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

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

Ответ 7

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

Пример кода примера Willow Schlanger выглядит как хороший (см. его ответ для более подробной информации).

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

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

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

Ответ 9

Взгляните на рекомендации UTF-8 Everywhere