Странное сравнение строк UTF8 - PullRequest
3 голосов
/ 03 сентября 2010

У меня возникла проблема со сравнением строк UTF8, о которой я понятия не имею, и это начинает вызывать у меня головную боль. Пожалуйста, помогите мне.
В основном у меня есть эта строка из XML-документа, закодированного в UTF8: 'Mina Tidigare anställningar'
И когда я сравниваю эту строку с точно такой же строкой, которую я набрал сам: «Mina Tidigare anställningar» (также в UTF8). И результат ЛОЖЬ !!!
Понятия не имею почему. Это так странно. Кто-нибудь может мне помочь?

Ответы [ 3 ]

21 голосов
/ 03 сентября 2010

Это кажется несколько уместным . Для упрощения существует несколько способов получить один и тот же текст в Unicode (и, следовательно, UTF8): например, это: ř можно записать как один символ ř или как два символа: r и объединяющий ˇ.

Лучшей ставкой будет * нормализатор класса 1012 * - нормализуйте обе строки в одной и той же форме нормализации и сравните результаты.

В одном из комментариев вы показываете эти шестнадцатеричные представления строк:

4d696e61205469646967617265 20   616e7374 c3a4   6c6c6e696e676172  // from XML
4d696e61205469646967617265 c2a0 616e7374 61cc88 6c6c6e696e676172 // typed
        ^^-----------------^^^^1         ^^^^^^2

Обратите внимание на части, которые я отметил, по-видимому, есть две части этой проблемы.

  • Во-первых, соблюдайте этот вопрос о значении последовательности байтов "c2a0" - по какой-то причине ваша типография переводится в неразрывное пространство, где XML-файл имеет нормальный пространство. Обратите внимание, что в обоих случаях после "Мины" есть нормальное место. Не уверен, что делать с , что в PHP, за исключением того, чтобы заменить все пробелы нормальным пробелом.

  • Что касается второго, то это тот случай, который я обрисовал выше: c3a4 - это ä (U + 00E4 "МАЛЕНЬКОЕ ПИСЬМО А С ДИАРЕЗОМ" - один символ, два байта ), тогда как 61 - это a (U + 0061 "LATIN SMALL LETTER A" - один символ, один байт), а cc88 будет умножением объединения " (U + 0308 «ДИАРЕЗ КОМБИНИРОВАНИЯ» - два символа, три байта). Здесь должна быть полезна библиотека нормализации .

2 голосов
/ 03 сентября 2010

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

0 голосов
/ 03 сентября 2010

mb_detect_encoding ($ s, "UTF-8") == "UTF-8"? : $ s = utf8_encode ($ s);

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