Символы Unicode, имеющие асимметричный верхний / нижний регистр. Зачем? - PullRequest
11 голосов
/ 21 сентября 2011

Почему следующие три символа не имеют симметричных toLower, toUpper результатов

/**
  * Written in the Scala programming language, typed into the Scala REPL.
  * Results commented accordingly.
  */
/* Unicode Character 'LATIN CAPITAL LETTER SHARP S' (U+1E9E) */
'\u1e9e'.toHexString == "1e9e" // true
'\u1e9e'.toLower.toHexString == "df" // "df" == "df"
'\u1e9e'.toHexString == '\u1e9e'.toLower.toUpper.toHexString // "1e9e" != "df"
/* Unicode Character 'KELVIN SIGN' (U+212A) */
'\u212a'.toHexString == "212a" // "212a" == "212a"
'\u212a'.toLower.toHexString == "6b" // "6b" == "6b"
'\u212a'.toHexString == '\u212a'.toLower.toUpper.toHexString // "212a" != "4b"
/* Unicode Character 'LATIN CAPITAL LETTER I WITH DOT ABOVE' (U+0130) */
'\u0130'.toHexString == "130" // "130" == "130"
'\u0130'.toLower.toHexString == "69" // "69" == "69"
'\u0130'.toHexString == '\u0130'.toLower.toUpper.toHexString // "130" != "49"

Ответы [ 2 ]

12 голосов
/ 21 сентября 2011

Для первого есть это объяснение :

В немецком языке Sharp S ("ß" или U + 00df) - это строчная буква,и заглавными буквами «SS».

Другими словами, U + 1E9E строчные буквы до U + 00DF, но верхний регистр U + 00DF не U + 1E9E.

Во втором случае U + 212A (КЕЛЬВИНСКИЙ ЗНАК) в нижнем регистре до U + 0068 (ЛАТИНСКОЕ МАЛЕНЬКОЕ ПИСЬМО K).Верхний регистр U + 0068 - U + 004B (LATIN CAPITAL LETTER K).Это, кажется, имеет смысл для меня.

В третьем случае U + 0130 (LATIN CAPITAL LETTER I WITH DOT ABE) является турецким / азербайджанским символом, который строчными буквами до U + 0069 (LATIN SMALL LETTERЯ).Я полагаю, что если бы вы оказались в турецкой / азербайджанской локали, вы бы получили правильную версию U + 0069 в верхнем регистре, но это не обязательно было бы универсально.

Символы не обязательно должны иметь симметричную верхнюю- и преобразования в нижнем регистре.

Редактировать: Чтобы ответить на комментарий PhiLho, приведенный ниже, спецификация Unicode 6.0 говорит об U + 212A (ЗНАК КЕЛЬВИНА):

Три буквоподобных символа получили каноническую эквивалентность обычным буквам: ЗНАК U + 2126, ЗНАК U + 212A ЗНАК КЕЛЬВИНА и ЗНАК АНГСТРОМА U + 212B.Во всех трех случаях следует использовать обычное письмо.Если текст нормализован в соответствии со Стандартом Unicode № 15 «Формы нормализации Юникода», эти три символа будут заменены их обычными эквивалентами.

Другими словами, вам не следует использовать U+ 212A, вместо этого вы должны использовать U + 004B (LATIN CAPITAL LETTER K), и если вы нормализуете текст Unicode, U + 212A следует заменить на U + 004B.

3 голосов
/ 21 сентября 2011

Могу ли я сослаться на другой пост о Юникоде и верхнем и нижнем регистре ... Распространенной ошибкой считается, что знаки для языка должны быть доступны в верхнем и нижнем регистре!

Юникод-правильный регистр заголовка в Java

...