Символы Unicode, имеющие асимметричный верхний/нижний регистр. Почему?

почему следующие три символа не симметричного 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 ответов


для первого, есть данное объяснение:

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

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

для второго, U+212A (знак Кельвина) в нижнем регистре до U+0068 (Латинская маленькая буква K). Верхний регистр U + 0068 - U+004B (Латинская заглавная буква K). Мне кажется, это имеет смысл.

в третьем случае U + 0130 (Латинская заглавная буква I с точкой выше) является турецким/азербайджанским символом, который строчными буквами до U+0069 (Латинская маленькая буква I). Я бы предположил, что если бы вы каким-то образом находились в турецко-азербайджанском регионе, вы получили бы правильную версию U+0069, но это не обязательно может быть универсальным.

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

Edit: ответить на комментарий PhiLho ниже, то Unicode 6.0 spec имеет это сказать о U+212A (знак Кельвина):

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

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


могу ли я обратиться к другому сообщению о Unicode и верхнем и нижнем регистре.. Это распространенная ошибка думать, что знаки языка должны быть доступна в верхнем и нижнем регистре!

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