11

为什么下面三个字符没有对称toLowertoUpper结果

/**
  * 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"
4

2 回答 2

13

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

在德语中,Sharp S(“ß”或 U+00df)是一个小写字母,它大写为字母“SS”。

换句话说,U+1E9E 小写为 U+00DF,但 U+00DF 的大写不是 U+1E9E。

对于第二个,U+212A (KELVIN SIGN) 小写为 U+0068 (LATIN SMALL LETTER K)。U+0068 的大写字母是 U+004B(拉丁文大写字母 K)。这对我来说似乎很有意义。

对于第三种情况,U+0130(LATIN CAPITAL LETTER I WITH DOT ABOVE)是土耳其语/阿塞拜疆语字符,小写为 U+0069(LATIN SMALL LETTER I)。我想如果你在土耳其/阿塞拜疆语言环境中,你会得到 U+0069 的正确大写版本,但这可能不一定是通用的。

字符不一定要具有对称的大小写转换。

编辑:为了回应 PhiLho 在下面的评论,Unicode 6.0 规范对 U+212A (KELVIN SIGN) 有这样的说法:

三个类似字母的符号已被赋予与常规字母等效的规范:U+2126 OHM SIGN、U+212A KELVIN SIGN和 U+212B ANGSTROM SIGN。在所有三种情况下,都应使用常规字母。如果根据 Unicode 标准附件 #15“Unicode 规范化形式”对文本进行规范化,这三个字符将被它们的常规等效字符替换。

换句话说,您实际上不应该使用 U+212A,而应该使用 U+004B(拉丁大写字母 K),如果您规范化 Unicode 文本,则应将 U+212A 替换为 U+004B。

于 2011-09-20T21:07:20.607 回答
3

我可以参考另一篇关于 Unicode 和大写和小写的帖子。认为一种语言的符号必须以大写和小写形式出现是一个常见的错误!

Java中Unicode正确的标题大小写

于 2011-09-20T21:19:19.877 回答