6

要不区分大小写地比较两个字符串,一种正确的方法是先将它们大小写折叠。这比上壳或下壳好多少?

我发现小写字母不能在网上正常工作的例子。例如,“σ”和“ς”(“Σ”的两种形式)在转换为小写时不会变得相同。但我没能找到为什么大小写折叠比映射到大写更好。是否存在应该不区分大小写的两个字符串对相同字符串不大写的情况?

另一种情况是当我想存储不区分大小写的索引时。推荐的方法似乎是案例折叠然后规范化。与存储映射为大写和规范化的字符串相比,它有什么优势?规范说映射到大写不能保证跨 Unicode 版本是稳定的,而大小写折叠是。但是在早期版本的 Unicode 中,是否存在映射到大写的不同字符串的情况?

4

2 回答 2

9

根据Unicode 稳定性策略,大小写映射仅对大小写对是稳定的,即字符对XY,其中X是 Y 的完整大写映射,Y 是 X完整小写映射。只有当这两个字符都具有这些属性时,它们之间的大小写关系才一成不变。

但是,Unicode 包含许多“不完整”的大小写对,其中只有小写形式已被编码,而大写形式完全缺失。这通常是用于传统上仅小写字母的转录系统中的字母的情况。如果发现大写形式并随后将其添加到 Unicode,则这些字母将收到新的大写映射。

最近发生的字符是“ʂ”(来自 Unicode 1.1)、“ᶎ”(来自 Unicode 4.1)和“ꞔ”(来自 Unicode 7.0),它们都具有全新的大写形式(Ꞔ、Ʂ、Ᶎ ) 两年前的 Unicode 12.0。

因为大小写映射不必是唯一的,这使得大写字母不能很好地替代正确的大小写折叠。例如,U+0434 (д) 和 U+1C81 (ᲁ) 都大写到 U+0414 (Д),但由于是 U+0414 的完整小写映射,只有前者被锁定为大小写对。如果有人在一些旧手稿中找到了 U+1C81 的专用大写字母版本,它会被赋予一个新的大写映射,导致 U+0434 和 U+1C81 在该操作下突然不再比较相等。

编辑:我刚刚记得一个大写字母不足以进行不区分大小写的匹配的当前示例:U+1E9E (ẞ) 已经是大写字母,因此对其自身大写。它的小写对应物是 U+00DF (ß),但 U+00DF 的大写映射是序列 <U+0053, U+0053> (S​​S)。

uppercase("ẞ&quot;) ≠ uppercase(lowercase("ẞ&quot;))
于 2021-04-15T12:32:02.643 回答
0

我从这里找到了一份清单。

从 Unicode 13.0.0 开始。

具有超过 1 个大写映射的等价类。

案例折叠 原来的 大写
k 006B 拉丁文小写字母 K K 004B 拉丁文大写字母 K K 004B 拉丁文大写字母 K
k 006B 拉丁文小写字母 K K 004B 拉丁文大写字母 K
K 212A 开尔文标志 K 212A 开尔文标志
ss 0073 拉丁文小写字母 S;0073 拉丁文小写字母 S ß 00DF 拉丁文小写字母 SHARP S SS 0053 拉丁文大写字母 S;0053 拉丁文大写字母 S
ẞ 1E9E 拉丁文大写字母 SHARP S ẞ 1E9E 拉丁文大写字母 SHARP S
å 00E5 拉丁文小写字母 A,带环 Å 00C5 拉丁文大写字母 A,上面有环 Å 00C5 拉丁文大写字母 A,上面有环
å 00E5 拉丁文小写字母 A,带环 Å 00C5 拉丁文大写字母 A,上面有环
Å 212B 埃格斯特罗姆标志 Å 212B 埃格斯特罗姆标志
θ 03B8 希腊小写字母 THETA Θ 0398 希腊大写字母 THETA Θ 0398 希腊大写字母 THETA
θ 03B8 希腊小写字母 THETA Θ 0398 希腊大写字母 THETA
ϑ 03D1 希腊 THETA 符号 Θ 0398 希腊大写字母 THETA
ϴ 03F4 希腊大写 THETA 符号 ϴ 03F4 希腊大写 THETA 符号
ω 03C9 希腊小写字母 OMEGA Ω 03A9 希腊大写字母 OMEGA Ω 03A9 希腊大写字母 OMEGA
ω 03C9 希腊小写字母 OMEGA Ω 03A9 希腊大写字母 OMEGA
Ω 2126 欧姆标志 Ω 2126 欧姆标志

并用于小写。

案例折叠 原来的 小写
s 0073 拉丁文小写字母 S S 0053 拉丁文大写字母 S s 0073 拉丁文小写字母 S
s 0073 拉丁文小写字母 S s 0073 拉丁文小写字母 S
ſ 017F 拉丁文小写字母 LONG S ſ 017F 拉丁文小写字母 LONG S
st 0073 拉丁文小写字母 S;0074 拉丁文小写字母 T ſt FB05 拉丁文小连字长 ST ſt FB05 拉丁文小连字长 ST
st FB06 拉丁小结字 ST st FB06 拉丁小结字 ST
β 03B2 希腊小写字母 BETA Β 0392 希腊大写字母 BETA β 03B2 希腊小写字母 BETA
β 03B2 希腊小写字母 BETA β 03B2 希腊小写字母 BETA
ϐ 03D0 希腊 BETA 符号 ϐ 03D0 希腊 BETA 符号
ε 03B5 希腊小写字母 EPSILON Ε 0395 希腊大写字母 EPSILON ε 03B5 希腊小写字母 EPSILON
ε 03B5 希腊小写字母 EPSILON ε 03B5 希腊小写字母 EPSILON
ϵ 03F5 希腊新月 EPSILON 符号 ϵ 03F5 希腊新月 EPSILON 符号
θ 03B8 希腊小写字母 THETA Θ 0398 希腊大写字母 THETA θ 03B8 希腊小写字母 THETA
θ 03B8 希腊小写字母 THETA θ 03B8 希腊小写字母 THETA
ϑ 03D1 希腊 THETA 符号 ϑ 03D1 希腊 THETA 符号
ϴ 03F4 希腊大写 THETA 符号 θ 03B8 希腊小写字母 THETA
ι 03B9 希腊小写字母 IOTA ◌ͅ 0345 结合希腊语 YPOGEGRAMMENI ◌ͅ 0345 结合希腊语 YPOGEGRAMMENI
Ι 0399 希腊大写字母 IOTA ι 03B9 希腊小写字母 IOTA
ι 03B9 希腊小写字母 IOTA ι 03B9 希腊小写字母 IOTA
ι 1FBE 希腊语 PROSGEGRAMMENI ι 1FBE 希腊语 PROSGEGRAMMENI
ΐ 03B9 希腊小写字母 IOTA;第0308章 0301 结合尖锐的口音 ΐ 0390 带有 DIALYTIKA 和 TONOS 的希腊小写字母 IOTA ΐ 0390 带有 DIALYTIKA 和 TONOS 的希腊小写字母 IOTA
ΐ 1FD3 希腊小写字母 IOTA 与 DIALYTIKA 和 OXIA ΐ 1FD3 希腊小写字母 IOTA 与 DIALYTIKA 和 OXIA
κ 03BA 希腊小写字母 KAPPA Κ 039A 希腊大写字母 KAPPA κ 03BA 希腊小写字母 KAPPA
κ 03BA 希腊小写字母 KAPPA κ 03BA 希腊小写字母 KAPPA
ϰ 03F0 希腊卡帕符号 ϰ 03F0 希腊卡帕符号
μ 03BC 希腊小写字母 MU µ 00B5 微信号 µ 00B5 微信号
Μ 039C 希腊大写字母 MU μ 03BC 希腊小写字母 MU
μ 03BC 希腊小写字母 MU μ 03BC 希腊小写字母 MU
π 03C0 希腊小写字母 PI Π 03A0 希腊大写字母 PI π 03C0 希腊小写字母 PI
π 03C0 希腊小写字母 PI π 03C0 希腊小写字母 PI
ϖ 03D6 希腊 PI 符号 ϖ 03D6 希腊 PI 符号
ρ 03C1 希腊小写字母 RHO Ρ 03A1 希腊大写字母 RHO ρ 03C1 希腊小写字母 RHO
ρ 03C1 希腊小写字母 RHO ρ 03C1 希腊小写字母 RHO
ϱ 03F1 希腊 RHO 符号 ϱ 03F1 希腊 RHO 符号
σ 03C3 希腊小写字母 SIGMA Σ 03A3 希腊大写字母 SIGMA σ 03C3 希腊小写字母 SIGMA
ς 03C2 希腊小写字母结尾 SIGMA ς 03C2 希腊小写字母结尾 SIGMA
σ 03C3 希腊小写字母 SIGMA σ 03C3 希腊小写字母 SIGMA
ΰ 03C5 希腊小写字母 UPSILON; 第0308章 0301 结合尖锐的口音 ΰ 03B0 希腊小写字母 UPSILON 与 DIALYTIKA 和 TONOS ΰ 03B0 希腊小写字母 UPSILON 与 DIALYTIKA 和 TONOS
ΰ 1FE3 希腊小写字母 UPSILON 与 DIALYTIKA 和 OXIA ΰ 1FE3 希腊小写字母 UPSILON 与 DIALYTIKA 和 OXIA
φ 03C6 希腊小写字母 PHI Φ 03A6 希腊大写字母 PHI φ 03C6 希腊小写字母 PHI
φ 03C6 希腊小写字母 PHI φ 03C6 希腊小写字母 PHI
φ 03D5 希腊 PHI 符号 φ 03D5 希腊 PHI 符号
в 0432 西里尔小写字母 VE В 0412 西里尔大写字母 VE в 0432 西里尔小写字母 VE
в 0432 西里尔小写字母 VE в 0432 西里尔小写字母 VE
ᲀ 1C80 西里尔小写字母圆角 VE ᲀ 1C80 西里尔小写字母圆角 VE
ä 0434 西里尔小写字母 DE Д 0414 西里尔大写字母 DE ä 0434 西里尔小写字母 DE
ä 0434 西里尔小写字母 DE ä 0434 西里尔小写字母 DE
ᲁ 1C81 西里尔小写字母 LONG-LEGGED DE ᲁ 1C81 西里尔小写字母 LONG-LEGGED DE
о 043E 西里尔小写字母 O О 041E 西里尔大写字母 O о 043E 西里尔小写字母 O
о 043E 西里尔小写字母 O о 043E 西里尔小写字母 O
ᲂ 1C82 西里尔小写字母窄 O ᲂ 1C82 西里尔小写字母窄 O
ñ 0441 西里尔小写字母 ES С 0421 西里尔大写字母 ES ñ 0441 西里尔小写字母 ES
ñ 0441 西里尔小写字母 ES ñ 0441 西里尔小写字母 ES
ᲃ 1C83 西里尔小写字母宽 ES ᲃ 1C83 西里尔小写字母宽 ES
来自 0442 西里尔小写字母 TE Т 0422 西里尔大写字母 TE 来自 0442 西里尔小写字母 TE
来自 0442 西里尔小写字母 TE 来自 0442 西里尔小写字母 TE
ᲄ 1C84 西里尔小写字母 TALL TE ᲄ 1C84 西里尔小写字母 TALL TE
ᲅ 1C85 西里尔小写字母三腿 TE ᲅ 1C85 西里尔小写字母三腿 TE
ъ 044A 西里尔小写字母硬符号 Ъ 042A 西里尔大写字母硬符号 ъ 044A 西里尔小写字母硬符号
ъ 044A 西里尔小写字母硬符号 ъ 044A 西里尔小写字母硬符号
ᲆ 1C86 西里尔小写字母高硬标志 ᲆ 1C86 西里尔小写字母高硬标志
ѣ 0463 西里尔小写字母 YAT Ѣ 0462 西里尔大写字母 YAT ѣ 0463 西里尔小写字母 YAT
ѣ 0463 西里尔小写字母 YAT ѣ 0463 西里尔小写字母 YAT
ᲇ 1C87 西里尔小写字母 TALL YAT ᲇ 1C87 西里尔小写字母 TALL YAT
ṡ 1E61 上面带点的拉丁文小写字母 S Ṡ 1E60 上面带点的拉丁文大写字母 S ṡ 1E61 上面带点的拉丁文小写字母 S
ṡ 1E61 上面带点的拉丁文小写字母 S ṡ 1E61 上面带点的拉丁文小写字母 S
ẛ 1E9B 拉丁文小写字母长 S,上面带点 ẛ 1E9B 拉丁文小写字母长 S,上面带点
ꙋ A64B 西里尔小写字母专着英国 ᲈ 1C88 西里尔小写字母未混合英国 ᲈ 1C88 西里尔小写字母未混合英国
Ꙋ A64A 西里尔大写字母专着英国 ꙋ A64B 西里尔小写字母专着英国
ꙋ A64B 西里尔小写字母专着英国 ꙋ A64B 西里尔小写字母专着英国

对于小写(大写(X))。

案例折叠 原来的 大写的小写
ss 0073 拉丁文小写字母 S;0073 拉丁文小写字母 S ß 00DF 拉丁文小写字母 SHARP S ss 0073 拉丁文小写字母 S;0073 拉丁文小写字母 S
ẞ 1E9E 拉丁文大写字母 SHARP S ß 00DF 拉丁文小写字母 SHARP S

对于大写(小写),没有等价组有多个结果。

于 2021-05-06T13:44:16.047 回答