Вопрос по c++, unicode – UTF-8 везде

102

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

Ваш Ответ

9   ответов
9

+, текущий стандарт 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 для более глубокой обработки. Есть несколько предложенийв настоящее время в работе включить более надежную поддержку преобразования текста между различными кодировками. Я думаю (и надеюсь), что это будет частью следующеготехнический отчет.

@BenCollinsРаздел 2.14.5 «Строковые литералы» - обсуждаются строковые литералы, включая строковые литералы для кодировок UTF-8, UTF-16 и UTF-32.Раздел 22.4.1.4 «Шаблон класса codecvt» - обсуждается класс codecvt, используемый для преобразования между кодировками символов (включая UTF-8, UTF-16 и UTF-32). В документе есть еще кое-что о поддержке Unicode, но, похоже, это самые важные разделы по этому вопросу. eestrada
Эта ссылка на черновик стандартного документа не очень полезна без ссылки на конкретный раздел, который описывает «встроенную поддержку Unicode», которую вы обсуждаете. Ben Collins
4

Все строки заключены в _T («моя строка»)функции strlen () и т. д. заменены на _tcslen () и т. д.Используйте LPTSTR и LPCTSTR вместо char * и const char *При запуске новых проектов в Dev Studio тщательно следите за тем, чтобы в свойствах вашего проекта был выбран параметр Юникод.Для строк C ++ используйте std :: wstring вместо std :: string
Не используйте строки, символы и функции "T", если только вы не собираетесь выполнять сборки как в Юникоде, так и в ANSI. Если вы собираетесь собирать только Unicode, просто делайте обычные широкие символы: L "моя широкая строка" wcslen (L "моя строка") и т. Д. 1800 INFORMATION
Честно говоря, я думаю, что UTF16 - пустая трата времени, поэтому все кодировки в UTF8 проще и более совместимы с * nix. chacham15
Если вы хотите использовать строки Unicode и ANSI для C ++, используйте что-то вроде typedef std :: basic_string <TCHAR> tString; Serge
Согласитесь, используйте макросы _T только в том случае, если вам нужен общий текст, т.е. возможность кодировать как Unicode, так и Ascii / MBCS. user2189331
Ах да, я всегда делаю #ifdef _UNICODE #define tstring std :: wstring #else #define tstring std :: string #endif, но мне нравится твой путь лучше, Серж. Adam Pierce
3

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

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

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

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

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

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

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

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

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

Встроенные библиотекиhttp://code.google.com/p/netwidecc/downloads/list (UTF8, UTF16LE, UTF16BE, UTF32)http://www.cprogramming.com/tutorial/unicode.html (UTF-8)http://utfcpp.sourceforge.net/ (Простая библиотека UTF8)
77
использованиеICU для работы с вашими данными (или подобной библиотекой)В вашем собственном хранилище данных убедитесь, что все хранится в той же кодировкеУбедитесь, что вы всегда используете свою библиотеку Unicode для таких рутинных задач, как длина строки, статус использования заглавных букв и т. Д. Никогда не используйте стандартные встроенные библиотеки, такие какis_alpha если это не то определение, которое вы хотите.Я не могу сказать это достаточно:никогда не перебирать индексыstring если вы заботитесь о правильности, всегда используйте для этого свою библиотеку юникода.
Если вы не лечитеstring как двоичные данные. Demi
8

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

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

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

0
0
2

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

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

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

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

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

Похожие вопросы