Какова наилучшая практика обработки 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, но было проще брать части из.
Вот список встроенных библиотек, которые кажутся достойными.
Встроенные библиотеки
- http://code.google.com/p/netwidecc/downloads/list (UTF8, UTF16LE, UTF16BE, UTF32)
- http://www.cprogramming.com/tutorial/unicode.html (UTF8)
- http://utfcpp.sourceforge.net/ (простая библиотека UTF8)
Ответ 8
Использовать IBM Международные компоненты для Юникода
Ответ 9
Взгляните на рекомендации UTF-8 Everywhere