最近我多次输入卡尔·魏尔斯特拉斯 (Karl Weierstrass) 的名字,并想到有时他的名字在英文文本中会被写成 Weierstraß。这让我查找了何时使用 ß 和何时使用 ss 的规则。这些规则相当复杂,并且会随着时间和地点的变化而变化。这里我只想看看大写规则。
通常,在从小写转换为大写时,ß 会被替换为 SS。这意味着字符串的长度可能会随着大小写的变化而变化。这无疑已经导致了许多软件错误。
>>> w =“Weierstraß” >>> len(w), len(w.upper()) (10,11)
直到 2008 年引入 ẞ (U+1E9E) 之前,ß (U+00DF) 都没有对应的大写字母。我想知道,如果我将语言环境设置为 de_DE(德国),上面的代码的运行是否会有所不同。w.upper w.upper()
会返回WEIERSTRASS
还是WEIERSTRAẞ
?
事实证明,Python 遵循 Unicode 的大小写映射规则,这些规则规定 ß 转换为大写时会变成 SS。代码在任何语言环境下运行效果相同。因此,如果您想将 ß 转换为大写形式 ẞ,则必须使用自定义代码。
ASCII 的设计使得大小写英文字母相差 32 个字符(即十六进制的 0x20)。除了少数例外,Unicode 也沿用了这一惯例,德语也基本如此,如以下代码所示。
上部 =“ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜẞ” 较低 = “abcdefghijklmnopqrstuvwxyzäöüß” 对于 u,l 在 zip(upper,lower)中: 如果 ord(l) - ord(u) != 32: 打印(“异常:”,u,l)
这打印
例外:ẞ ß
在 Unicode 之前的 ASCII 扩展中,Ä 和 ä、Ö 和 ö 以及 Ü 和 ü 的码位间隔 32 点,并且该间隔被沿用到了 Unicode 中。但大写字母 ẞ 的 Unicode 值不能为 U+00BF,因为该码位已被倒置问号 ¿ 占用。
文章“Uppercase Eszett”最先出现在John D. Cook上。
原文: https://www.johndcook.com/blog/2025/08/14/uppercase-eszett/