Проблема не в кодировании.Один файл или один терминал может иметь только одну кодировку. Если вы скопируете и вставляете обе строки в один и тот же исходный файл или одно и то же окно терминала, они будут вставлены с одинаковой кодировкой.
Проблема также не в нормализации или сгибании.
Первая строка имеет 4 октета: 0xD0 0xB0 0x6E 0x64
. Первые два октета представляют собой двухоктовое кодирование UTF-8 одного кодового слова Unicode, третий и четвертый октеты - однооктевые кодировки UTF-8 кодовых точек Unicode.
Итак, строка состоит из трех кодов Unicode: U+0430 U+006E U+0064
.
Эти три кодовые решения следующих трех символов:
- кириллице строчной буквы A
- Строчная латинская буква N
- Строчная латинская буква D
Вторая строка имеет 3 октета : 0x61 0x6E 0x64
. Все три октета - это однооктевые кодировки UTF-8 кодовых точек Unicode.
Итак, строка состоит из трех кодов Unicode: U+0061 U+006E U+0064
.
Эти три кодовые разрешения следующих трех персонажей:
- латинская буква А
- Строчная латинская буква N
- Строчная латинская буква D
Действительно, нет никаких проблем совсем! Две строки - разные. С помощью шрифта, который вы используете, кириллица a выглядит так же, как латинский a, но, что касается Unicode, это два разных символа. (И в другом шрифте они могут даже выглядеть по-другому!) Нет ничего, что можно сделать с точки зрения кодирования или Юникода, потому что проблема заключается не в кодировании, а в Unicode.
Это называется homoglyph, причем два символа отличаются друг от друга, но имеют одинаковые (или очень похожие) глифы.
Что вы могли попытаться сделать это транслитерации все строки в латинском (при условии, что вы можете гарантировать, что никто не хочет, чтобы ввести не-латинские символы), но на самом деле, вопросы:
- Где происходит ли это из кириллицы?
- Возможно, это было означает быть кириллицей a и действительно должен быть обработанным не равным латинскому a?
И в зависимости от ответов на эти вопросы вы можете либо исправить источник, либо просто ничего не делать.
Это очень горячая тема для поставщиков браузеров BTW, потому что в настоящее время кто-то может зарегистрировать домен google.com
(с одной из букв, отключенных для homoglpyh), и вы не сможете определить разницу в адресе бар. Это называется атакой гомографа. Вот почему они всегда отображают домен Punycode в дополнение к доменному имени Unicode.
Черт бы тебя побрал! На 26 секунд быстрее! :-D +1 –
Большое спасибо за прояснение этой проблемы для меня. Поскольку я запускаю сайт для публикации только на английском языке, я, вероятно, запрещаю символы вне выбранного набора сценариев Unicode. Я мог бы попробовать посмотреть, как идет перевод, но в любом случае большое спасибо вам! – user2726983