根据 Wikipedia,在 2017 年,使用大写字母
ẞ
(Unicode U+1E9E
)被正式采用——至少作为一种选择——因为实际上可能是德语中全大写单词的一个子集:
同年 6 月,德国正字法委员会正式通过了一项规则,即除了之前的大写形式 ⟨SS⟩ 之外,⟨ẞ⟩ 将成为大写 ⟨ß⟩ 的选项(即变体 STRASSE 和 STRAẞE 将被同等接受有效)。2
德语的这一新增功能似乎会大大简化字符串之间的大小写比较(所谓的“大小写折叠”或“折叠大小写”比较)。请注意,我开始这个查询是为了了解 Raku(又名 Perl6)的实现,但实际上这个问题似乎可以推广到其他编程语言。这是 Raku 的默认实现——从 rfdr_Regeln_2017.pdf 的 13 个单词开始,这些单词已经小写(通过 Raku 的
.lc
函数):
~$ cat TO_ẞ_OR_NOT_TO_ẞ.txt
maß straße grieß spieß groß grüßen außen außer draußen strauß beißen fleiß heißen
~$ raku -ne '.words>>.match(/^ <:Ll>+ $/).say;' TO_ẞ_OR_NOT_TO_ẞ.txt
(「maß」 「straße」 「grieß」 「spieß」 「groß」 「grüßen」 「außen」 「außer」 「draußen」 「strauß」 「beißen」 「fleiß」 「heißen」)
~$ raku -ne '.uc.say;' TO_ẞ_OR_NOT_TO_ẞ.txt
MASS STRASSE GRIESS SPIESS GROSS GRÜSSEN AUSSEN AUSSER DRAUSSEN STRAUSS BEISSEN FLEISS HEISSEN
~$ raku -ne '.fc.say;' TO_ẞ_OR_NOT_TO_ẞ.txt
mass strasse griess spiess gross grüssen aussen ausser draussen strauss beissen fleiss heissen
令我惊讶的是,Raku 的
fc
折叠大小写实现基本上转换为小写 ss
。毫不奇怪,尝试在上/下“往返”单词和原始单词之间搜索 eq
字符串相等性都是 False
:
~$ raku -ne 'for .words {print $_.uc.lc eq $_.lc }; "".put;' TO_ẞ_OR_NOT_TO_ẞ.txt
FalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
折叠 (
.fc
) 单词匹配,但它们是基于 ss
字符,而不是 ß
:
~$ raku -ne 'for .words {print $_.uc.lc eq $_.fc }; "".put;' TO_ẞ_OR_NOT_TO_ẞ.txt
TrueTrueTrueTrueTrueTrueTrueTrueTrueTrueTrueTrueTrue
从一个大写-ẞ开始,再次使用一个大写/大写的单词来证明二分法:
~$ echo "straße STRASSE STRAẞE" | raku -ne ' .put for .words;'
straße
STRASSE
STRAẞE
~$ echo "straße STRASSE STRAẞE" | raku -ne ' .lc.say for .words;'
straße
strasse
straße
~$ echo "straße STRASSE STRAẞE" | raku -ne ' for .words { say $_.lc eq "straße" };'
True
False
True
~$ echo "straße STRASSE STRAẞE" | raku -ne ' for .words { say $_.lc eq $_.fc };'
False
True
False
是否有任何编程语言在默认情况下在小写
foldcase
大写
ß
<-->之间建立ẞ
转换?哪些编程语言添加了小写 ß
<--> 大写 ẞ
转换,作为选项(或通过库)? StackOverflow 上的许多问题/答案早于 2017 年的决定,所以我正在寻找最新的答案。
[附录:我通过这个 FAQ 注意到 Unicode 联盟的规则似乎与德国正字法委员会 2017 年的决定不一致]。
1。 Raku 中的默认转换是从小写德语
ß
到大写 SS
(如下所示)。
Unicode 在这些字母上有一个特殊的FAQ。但是,如果想使用 Raku 解决第一个
uc
大写问题,可以适当地转换 "ß" => "ẞ"
字符 prior to calling the bog-standard uc
uppercase method/function:
~$ cat TO_ẞ_OR_NOT_TO_ẞ_tclc.txt
Maß Straße Grieß Spieß Groß Grüßen Außen Außer Draußen Strauß Beißen Fleiß Heißen
raku -ne '.uc.put;' TO_ẞ_OR_NOT_TO_ẞ_tclc.txt
MASS STRASSE GRIESS SPIESS GROSS GRÜSSEN AUSSEN AUSSER DRAUSSEN STRAUSS BEISSEN FLEISS HEISSEN
~$ raku -ne '.trans("ß" => "ẞ").put;' TO_ẞ_OR_NOT_TO_ẞ_tclc.txt
Maẞ Straẞe Grieẞ Spieẞ Groẞ Grüẞen Auẞen Auẞer Drauẞen Strauẞ Beiẞen Fleiẞ Heiẞen
~$ raku -ne '.trans("ß" => "ẞ").uc.put;' TO_ẞ_OR_NOT_TO_ẞ_tclc.txt
MAẞ STRAẞE GRIEẞ SPIEẞ GROẞ GRÜẞEN AUẞEN AUẞER DRAUẞEN STRAUẞ BEIẞEN FLEIẞ HEIẞEN
上面的代码适用于使用
ẞ
而不是 SS
的大写文本——本着真正的 Raku/Perl 精神——有不止一种方法可以做到这一点(TMTOWTDI):
~$ raku -ne '.trans("ß" => "ẞ").uc.put;' file
~$ raku -e '.trans("ß" => "ẞ").uc.put for lines();' file
~$ raku -e 'put .trans("ß" => "ẞ").uc for lines();' file
~$ raku -e 'slurp.trans("ß" => "ẞ").uc.put;' file
~$ raku -e 'slurp.trans( "\x[00DF]" => "\x[1E9E]" ).uc.put;' file
~$ raku -e 'slurp.trans("LATIN SMALL LETTER SHARP S".uniparse => "LATIN CAPITAL LETTER SHARP S".uniparse).uc.put;' file
2。 Unicode 根据 Unicode Casefolding Stability Policy.
指定 foldcase 对的稳定性至于
fc
折叠稳定性,我曾希望 "ß" => "ẞ"
的先前转换将提供一个“第 30 个大写字符”,它可以有一个同源折叠伙伴(成对)。下面的代码看起来很有前途,因为从混合大小写文本的小样本开始,您可以从大写到小写“往返”,并且仍然有匹配小写的输出文本:
~$ raku -ne 'for .words {print $_.uc.lc eq $_.lc }; "".put;' TO_ẞ_OR_NOT_TO_ẞ_tclc.txt
FalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
~$ raku -ne 'for .words {print $_.trans("ß" => "ẞ").uc.lc eq $_.lc }; "".put;' TO_ẞ_OR_NOT_TO_ẞ_tclc.txt
TrueTrueTrueTrueTrueTrueTrueTrueTrueTrueTrueTrueTrue
但是,下面的
fc
foldcase 代码表明,当前的操作过程是采用大写 ẞ
并将其转换为小写 ss
(而不是小写 ß
),无论:
~$ raku -ne '.trans("ß" => "ẞ").fc.put;' TO_ẞ_OR_NOT_TO_ẞ_tclc.txt
mass strasse griess spiess gross grüssen aussen ausser draussen strauss beissen fleiss heissen
~$ raku -ne 'for .words {print $_.trans("ß" => "ẞ").uc.fc eq $_.fc }; "".put;' TO_ẞ_OR_NOT_TO_ẞ_tclc.txt
TrueTrueTrueTrueTrueTrueTrueTrueTrueTrueTrueTrueTrue
~$ raku -ne 'for .words {print $_.trans("ß" => "ẞ").uc.lc eq $_.fc }; "".put;' TO_ẞ_OR_NOT_TO_ẞ_tclc.txt
FalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
变化?根据 2017 年 StackOverflow 的帖子,“等半个世纪。”