Вопрос

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

Это было полезно?

Решение

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

  • Модель кодовой страницы
  • Наборы двухбайтовых символов в Windows
  • Юникод
  • Проблемы совместимости в смешанных средах
  • Преобразование данных Юникода
  • Миграция программ для Windows в Unicode
  • Краткое содержание

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

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

Мой код находится под лицензией New BSD, и его можно найти здесь:

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

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

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

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

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

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

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

Ознакомьтесь с рекомендациями UTF-8 везде

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top