为什么以下三个字符不具有对称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"
答案 0 :(得分:12)
对于第一个,有this explanation:
在德语中,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(LATIN CAPITAL LETTER K)。这个似乎对我有意义。
对于第三种情况,U + 0130(拉丁语大写字母I,上面有点)是土耳其语/阿塞拜疆语字符,小写字母为U + 0069(拉丁语小写字母I)。我想如果你在土耳其/阿塞拜疆的某个地方,你会得到U + 0069的正确大写版本,但这可能不一定是普遍的。
字符不一定具有对称的大写和小写转换。
编辑:为回应下面的PhiLho评论,Unicode 6.0 spec对此有关于U + 212A(KELVIN SIGN)的说法:
三个字母符号被赋予规范字母的规范等价:U + 2126 OHM SIGN, U + 212A KELVIN SIGN ,以及U + 212B ANGSTROM SIGN。在所有三个实例中,应使用常规字母。如果根据Unicode标准附件#15“Unicode规范化表单”对文本进行规范化,则这三个字符将被其常规等效字符替换。
换句话说,你不应该真正使用U + 212A,你应该使用U + 004B(LATIN CAPITAL LETTER K),如果你规范化你的Unicode文本,U + 212A应该用U +替换004B。
答案 1 :(得分:3)
我可以参考另一篇关于Unicode和大小写的帖子。 在大写和小写的情况下,认为语言的符号必须是一个常见的错误!