为什么 "ss" 等于德语升号 s 字符 'ß'?

Why is "ss" equal to the German sharp-s character 'ß'?

来自 I'm wondering why ä and ae are different(which makes sense) but ß and ss are treated as equal. I haven't found an answer on SO even if this question 似乎是相关的,甚至提到了 "that ß will compare equal to SS in Germany, or similar" 但不是为什么。

我在 MSDN 上找到的唯一资源是:How to: Compare Strings

这里提到了以下但也缺少 为什么:

// "They dance in the street." 
// Linguistically (in Windows), "ss" is equal to 
// the German essetz: 'ß' character in both en-US and de-DE cultures. 
.....

那么为什么这个计算结果为 true,无论是 de-DE 文化还是任何其他文化:

var ci = new CultureInfo("de-DE");
int result = ci.CompareInfo.Compare("strasse", "straße", CompareOptions.IgnoreNonSpace); // 0
bool equals = String.Equals("strasse", "straße", StringComparison.CurrentCulture); // true
equals = String.Equals("strasse", "straße", StringComparison.InvariantCulture);  // true

因为德国人就是这样定义自己的语言的。或者也许最准确:那些为德语定义 sorting/collation 的人如何定义德国人如何定义德语。

在很大程度上,英语反对 i 的大写是 I,但其他使用拉丁字母的语言(例如土耳其语)不同意。

一些背景信息供您参考。 Taken from here.

Windows 替代代码

在 Windows 中,ALT 键加数字代码的组合可用于在任何 Windows 应用程序中键入非英语字符(重音字母或标点符号)。提供了有关使用 ALT 键键入重音符号的更多详细说明。在 Windows 中输入重音的其他选项也列在该网站的重音部分。

注意:字母 ü、ö、ä 和 ß 可以分别用 "ue"、"oe"、"ae" 或 "ss" 代替。

德语 ALT 代码

Sym Windows ALT Code

Ä   ALT+0196
ä   ALT+0228
Ö   ALT+0214
ö   ALT+0246
Ü   ALT+0220
ü   ALT+0252
ß   ALT+0223
€   ALT+0128

Taken from here.

在德语字母表中,字母 ß 称为 "Eszett"(国际音标:[ɛsˈtsɛt])或 "scharfes S",在英语中称为 "sharp S",是一个辅音,演变为连字"long s and z" (ſz) 和 "long s over round s" (ſs)。说话时发音为 [s](见国际音标)。自1996年德国正字法改革以来,它只用在长元音和双元音之后,而ss写在短元音之后。 eszett 这个名字来自两个字母 S 和 Z,因为它们在德语中的发音。它也被称为scharfes S(国际音标:德语:[ˈʃaɐ̯.fəs ˈʔɛs, ˈʃaː.fəs ˈʔɛs],意思是"sharp S"。它的Unicode编码是U+00DF。

在德语中 ß 字符(仅以小写形式存在)听起来像 ss。它的用法不时发生变化,许多人混淆 ßss。如果我们用大写字母写 Fuß(英尺)这样的词,我们会写成 FUSS。如果键盘或字体不支持 ß 我们写 ss 并且它(几乎,大部分)是正确的。

这可以解释为什么 ßss 在排序时被视为等价的。

如果您查看 Ä 页面,您会发现 Ä 并非总是 Æ(或 ae)的替代品,它仍然在各种语言中使用。

字母ß改为:

While the letter "ß" has been used in other languages, it is now only used in German. However, it is not used in Switzerland, Liechtenstein or Namibia.[1] German speakers in Germany, Austria, Belgium,[2] Denmark,[3] Luxembourg[4] and South Tyrol, Italy[5] follow the standard rules for ß.

所以 ß 在单一语言中使用,具有单一规则 (ß == ss),而 Ä 在多种语言中使用,具有多个规则。

请注意,考虑到 case folding 是:

Case folding is primarily used for caseless comparison of text, such as identifiers in a computer program, rather than actual text transformation

官方 Unicode 7.0 Case Folding Properties 告诉我们

00DF; F; 0073 0073; # LATIN SMALL LETTER SHARP S

其中 00DF 是 ß,0073 是 s,所以可以考虑 ß,为了不区分大小写的比较,作为 ss。

一些背景事实:

  • 在瑞士德语中,eszet 在 70 年代已经被 ss 取代,我认为

  • 对于大写转换,官方的德语替换规则一直是并且仍然是 eszet->SS,即使几年前已经为 unicode (U+1E9E) 定义了大写 eszet。我从来没有在野外的任何地方见过它!

  • 三个元音变音 äöü 一直有正确的大写版本 ÄÖÜ 除非您没有它们,否则没有进行或不需要这样的更改和替换。将它们替换为 ae,oe,ue 只是一种解决方法,不过,并不比用 beta 或 'B'..

  • 替换 eszet 好多少

所以不同的比较结果至少有一定的意义,尽管治疗,尤其是排序在德国之间并不是真正可靠地统一,比如字典或 phone 书籍、列表、索引等。

我在这里读到的大部分内容都是真实的。但是这里有一些误解,所以——作为一个德国人——让我直截了当地说:

ß/ẞ 是一个真正的德语字母,来自 ſs 或 ſz 的连字,但绝不是 ss。即长 s 后跟 s 或 z。

德语中音节 s 的发音为 /z/,而首尾音节 s 的发音为 /s/。由于德语中的字母 z 始终发音为 /ts/,它需要一种方法来区分那些罕见的情况,在这些情况下,通过添加另一个字母并最终为这些情况形成连字来打破该规则,其中一个中间音节发音为 /s/需要。

发音 /s/ 从来没有出现在 genuin 德语单词的开头,只出现在一个外来词中,它是 (tada!) 用 sz: Szene 写的。因此,大写 ß (ẞ) 的需要首先出现是因为整个单词的大写开始使用。 ß 和 ss 相同,历史上 ſz 和 ß 是,这就是为什么它被称为 "eszett"!有一些规则允许 ß 到 ss 翻译如果 ß 不可用,这在现代环境中是不正确的。

Maße 的正确大写是 MAẞE,Masse 的正确大写是 MASSE。两者在德语中是不同的词。

因此,在实际的德语中,ss 是 /s/ 之前的短元音,而 ß 是 /s/ 之后的长元音。假设 ss 和 ß 在任何比较中都相等是完全错误的,因为它可能会强制完全不同含义的词相等。期间.

再等半个世纪。

今年,经过一个多世纪的争论,德语正式添加 作为小写版本 ß 的有效大写替代。人们还需要一段时间才能习惯新的大写形式 ,但一旦大写版本 占据主导地位,就没有理由继续这种邪恶

String.Equals("Mr. Meißner", "Mr. Meissner", StringComparison.CurrentCulture) == true;

破解。

从 .Net 5.0 开始,这些比较现在 returns -1/NotEqual。详情见https://docs.microsoft.com/en-us/dotnet/core/compatibility/globalization/5.0/icu-globalization-api