Есть ли у заглавной буквы две альтернативы в нижнем регистре? - PullRequest
1 голос
/ 17 июня 2020

Существуют ли два символа: ch1, ch2, ch1 <> ch2 и ch1 и ch2 - строчные буквы, где uppercase(ch1) == uppercase(ch2)? Существует ли на самом деле такой символ в Юникоде?

Следующий вопрос: для любого ch, который является строчной буквой, всегда ли следующее выражение верно?

ch == lowercase(uppercase(ch))

Ответы [ 2 ]

0 голосов
/ 17 июня 2020

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

Но Unicode определяет также стандартный способ преобразования в верхний или нижний регистр, за исключением тюркских sh языков, которые могут иметь другие правила (отмечены T в CaseFolding.txt База данных Unicode и другие особые случаи для тюркского sh, греческого и литовского языков в SpecialCasing.txt).

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

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

Дополнительную информацию о базе данных Unicode вы найдете в документе Unicode: http://www.unicode.org/reports/tr44/#Casemapping и в стандарте Unicode (ссылки в документе, а также два файла, которые я назвал выше).

Примечание: некоторые символы увеличивают количество кодовых точек, поэтому при обратном преобразовании , следует проверить самое длинное совпадение.

0 голосов
/ 17 июня 2020

Сделал быстрый тест в Java:

public static void main(String[] args) {
    for (char ch1 = 0; ch1 < 65534; ch1++) {
        if (!isLetter(ch1) || !isLowerCase(ch1)) {
            continue;
        }
        String s1 = "" + ch1;
        for (char ch2 = (char) (ch1 + 1); ch2 < 65535; ch2++) {
            if (!isLetter(ch2) || !isLowerCase(ch2)) {
                continue;
            }
            String s2 = "" + ch2;
            if (s1.toUpperCase(Locale.US).equals(s2.toUpperCase(Locale.US))) {
                System.out.println("ch1=" + ch1 + " (" + (int) ch1 + "), ch2=" + ch2 + " (" + (int) ch2 + ")");
            }
        }
    }
}

Он печатает:

ch1=i (105), ch2=ı (305)
ch1=s (115), ch2=ſ (383)
ch1=µ (181), ch2=μ (956)
ch1=ΐ (912), ch2=ΐ (8147)
ch1=ΰ (944), ch2=ΰ (8163)
ch1=β (946), ch2=ϐ (976)
ch1=ε (949), ch2=ϵ (1013)
ch1=θ (952), ch2=ϑ (977)
ch1=ι (953), ch2=ι (8126)
ch1=κ (954), ch2=ϰ (1008)
ch1=π (960), ch2=ϖ (982)
ch1=ρ (961), ch2=ϱ (1009)
ch1=ς (962), ch2=σ (963)
ch1=φ (966), ch2=ϕ (981)
ch1=в (1074), ch2=ᲀ (7296)
ch1=д (1076), ch2=ᲁ (7297)
ch1=о (1086), ch2=ᲂ (7298)
ch1=с (1089), ch2=ᲃ (7299)
ch1=т (1090), ch2=ᲄ (7300)
ch1=т (1090), ch2=ᲅ (7301)
ch1=ъ (1098), ch2=ᲆ (7302)
ch1=ѣ (1123), ch2=ᲇ (7303)
ch1=ᲄ (7300), ch2=ᲅ (7301)
ch1=ᲈ (7304), ch2=ꙋ (42571)
ch1=ṡ (7777), ch2=ẛ (7835)
ch1=ſt (64261), ch2=st (64262)

Итак, ответ: да, есть разные символы, которые имеют одинаковые верхние- представительство по делу.

...