为什么下面三个字符不对称 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"

最佳答案

对于第一个,有 this explanation :

换句话说,U+1E9E 小写为 U+00DF,但 U+00DF 的大写不是 U+1E9E。
对于第二个,U+212A(KELVIN SIGN)小写为 U+0068(拉丁文小写字母 K)。 U+0068 的大写字母是 U+004B(拉丁文大写字母 K)。这个对我来说似乎很有意义。
对于第三种情况,U+0130(带点的拉丁文大写字母 I)是土耳其语/阿塞拜疆语字符,它小写为 U+0069(拉丁文小写字母 I)。我想如果你在土耳其/阿塞拜疆语言环境中,你会得到 U+0069 的正确大写版本,但这可能不一定是通用的。
字符不必具有对称的大写和小写转换。
编辑: 为了回应 PhiLho 在下面的评论,Unicode 6.0 spec 有关于 U+212A(凯尔文符号)的说明:

换句话说,你不应该真的使用 U+212A,你应该使用 U+004B(拉丁文大写字母 K),如果你规范化你的 Unicode 文本,U+212A 应该替换为 U+004B。

关于具有不对称大写/小写的 Unicode 字符。为什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7491680/

10-16 02:44