(德语)小写 ß (U+00DF) 和大写 ẞ (U+1E9E) 之间的折写转换?

问题描述 投票:0回答:1

根据 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 年的决定不一致]。

string unicode string-comparison raku unicode-string
1个回答
0
投票

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 的帖子,“等半个世纪。

https://raku.org

© www.soinside.com 2019 - 2024. All rights reserved.