具有非对称大小写的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"

对于第一个,有这样的解释:

在德语中,锐利的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规范对U+212A (KELVIN SIGN)有这样的说法:

三个类字母符号被赋予正则字母的正则等价性:U+2126欧姆符号,U+212A开尔文符号, U+212B埃符号。在这三种情况下,都应该使用常规字母。如果文本按照Unicode标准附件#15"Unicode规范化形式"进行规范化,则这三个字符将被它们的正则等量替换。

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

我可以参考另一篇关于Unicode和大小写的文章吗?认为语言的符号必须有大写和小写的是一个常见的错误!

最新更新