Почему верхнего регистра недостаточно для сравнения без учета регистра?

Чтобы сравнить две строки без учета регистра, один из правильных способов - сначала свернуть их по регистру. Чем это лучше, чем верхний или нижний кожух?

Я нахожу в Интернете примеры, когда нижний регистр не работает. Например, «σ» и «ς» (две формы «Σ») не становятся одинаковыми при преобразовании в нижний регистр. Но я не смог понять, почему складывание регистра лучше, чем отображение на верхний регистр. Есть ли случай, когда две строки, которые должны соответствовать регистру без учета регистра, не соответствуют одним и тем же строкам в верхнем регистре?

Другой сценарий - когда я хочу сохранить индекс без учета регистра. Рекомендуемый способ - сворачивание регистра и затем нормализация. Каковы его преимущества перед хранением строки, отображенной в верхнем регистре и нормализованной? В спецификациях говорится, что сопоставление с верхним регистром не гарантирует стабильной работы в разных версиях Unicode, в то время как сворачивание регистра является стабильным. Но есть ли случаи, когда отображение в верхний регистр дает другую строку в более ранней версии Unicode?

2 ответа

В соответствии с политикой стабильности Unicode , сопоставления регистра являются стабильными только для пар регистра, то есть пар символов X и Y, где X - полное отображение Y в верхнем регистре , а Y - полное отображение X в нижнем регистре . Только тогда, когда оба эти персонажа обладают этими свойствами, между ними высекается оболочка.

Однако Unicode содержит много «неполных» пар регистров, в которых закодирована только строчная форма, а прописная форма полностью отсутствует. Обычно это относится к буквам, используемым в системах транскрипции, которые традиционно являются только строчными. Если заглавные формы будут обнаружены и впоследствии добавлены в Unicode, эти буквы получат новое отображение в верхнем регистре.

Самые последние символы, с которыми это случилось, - это «ʂ» (из Unicode 1.1), «ᶎ» (из Unicode 4.1) и «ꞔ» (из Unicode 7.0), которые получили совершенно новые формы верхнего регистра (Ꞔ, Ʂ, Ᶎ ) в Unicode 12.0 два года назад.

Поскольку сопоставления регистра не обязательно должны быть уникальными, это делает верхний регистр плохой заменой правильному сворачиванию регистра. Например, как U+0434 (д), так и U+1C81 (ᲁ) прописные буквы до U+0414 (Д), но только первый блокируется в паре регистров в силу того, что он является полным строчным отображением U+0414. Если бы кто-то нашел специальную заглавную версию U+1C81 в какой-нибудь старой рукописи, ему было бы дано новое отображение в верхнем регистре, в результате чего U + 0434 и U+1C81 внезапно перестали сравнивать равные при этой операции.

РЕДАКТИРОВАТЬ: Я только что вспомнил текущий пример верхнего регистра, недостаточного для нечувствительного к регистру сопоставления: U+1E9E (ẞ) уже является заглавной буквой и, следовательно, заглавными буквами для себя. Его аналог в нижнем регистре - U+00DF (ß), но отображение U+00DF в верхнем регистре - это последовательность <U+0053, U+0053> (SS).

      uppercase("ẞ") ≠ uppercase(lowercase("ẞ"))

Я нашел список отсюда.

Начиная с Unicode 13.0.0.

Классы эквивалентности, которые имеют более одного отображения в верхнем регистре.

Для прописных букв (строчных) ни одна группа эквивалентности не дает множественных результатов.

Другие вопросы по тегам