Как я могу сравнить UTF8 строки, такие как персидские слова в C ++? - PullRequest
2 голосов
/ 22 августа 2011

Я хочу сравнить строки на персидском (utf8).Я знаю, что должен использовать нечто вроде L "گل", и оно должно быть сохранено в wchar_t * или wstringвопрос в том, когда я сравниваю по строкам функции compare (), я не получаю правильный результат.

Ответы [ 3 ]

3 голосов
/ 22 августа 2011

Юникод, как известно, трудно сравнивать.

Обратите внимание, что любая кодировка Unicode, включая UTF-8, 16 или 32, не может сравниваться побайтово для чего-либо, кроме байтового равенства. Отображение может быть идентичным, но используемые байты (такие как маркеры R-> L, суррогатные пары, модификаторы отображения и тому подобное, используемые в неанглийских языках, таких как персидский) не будут.

Как правило, вам нужно нормализовать Юникод, прежде чем вы сможете провести реалистичное сравнение, если значение текста имеет какое-либо значение:

http://userguide.icu -project.org / преобразования / нормализация

3 голосов
/ 22 августа 2011

wchar_t не для UTF-8, но (в зависимости от платформы) обычно либо UTF-16, либо UCS-32.Если вы хотите работать с UTF-8, используйте простые старые char * или string и их функции сравнения на равенство.Если вам нужна сортировка , понятная человеку, она становится гораздо более сложной (независимо от используемой кодировки).

2 голосов
/ 24 августа 2011

Если строки, которые вы хотите сравнить, уже находятся в определенной, определенной кодировке, то не используйте wchar_t и не используйте L"" литералы - это не для Unicode, а для определенной реализацией , непрозрачные кодировки только .

Если ваши строки в формате UTF-8, используйте строку char s. Если вы хотите преобразовать их в необработанные кодовые точки Unicode (UCS-4 / UTF-32) или если они уже есть в этой форме, сохраните их в строке uint32_t с или char32_t с, если у вас есть современный компилятор.

Если у вас есть C ++ 11, ваш литерал может быть char str8[] = u8"گل"; или char32_t str32[] = U"گل";. См. Эту тему , чтобы узнать больше об этом.

Если вы хотите взаимодействовать с аргументами командной строки или средой, используйте iconv() для преобразования из WCHAR в UTF-32 или UTF-8.

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