还有什么是 vb.net 函数,它将所有这些不同的字符映射到它们最标准的形式。
例如, tolower 会将 A 和 a 映射到同一个字符,对吗?
我需要为这些角色提供相同的功能
德语
ß === s Ü === u Χιοσ == Χίος
否则,有时我会插入 Χιοσ 和后者,当我插入 Χίος mysql 抱怨该 ID 已经存在时。
所以我想创建一个唯一的 ID,将所有这些奇怪的字符映射成一个更稳定的字符。
还有什么是 vb.net 函数,它将所有这些不同的字符映射到它们最标准的形式。
例如, tolower 会将 A 和 a 映射到同一个字符,对吗?
我需要为这些角色提供相同的功能
德语
ß === s Ü === u Χιοσ == Χίος
否则,有时我会插入 Χιοσ 和后者,当我插入 Χίος mysql 抱怨该 ID 已经存在时。
所以我想创建一个唯一的 ID,将所有这些奇怪的字符映射成一个更稳定的字符。
对于事物的编码方面,请查看String.Normalize
. 还要注意它的重载,它指定了您要将字符串转换为的特定范式,但默认范式 (C) 对于几乎所有想要“将所有这些不同的字符映射成最标准的形式”的人来说都可以正常工作。
但是,一旦您进入数据库并处理排序规则,事情就会变得更加复杂。
Unicode 规范化永远不会改变字符大小写。它仅涵盖字符基本相同的情况 - 看起来相同1,意思相同。例如,
Χιοσ != Χίος,
这两个 sigma 字符被认为是不等价的,带重音的 iota ( \u1F30
) 等价于两个字符的序列,即普通的 iota ( \u03B9
) 和重音 ( \u0313
)。
您真正的问题似乎是您使用 Unicode 字符串作为主键,这不是最流行的数据库设计实践。这样的主键占用了比需要更多的空间,并且随着时间的推移必然会发生变化(即使应用程序的初始版本不打算支持它)。哦,我忘记了他们对排序规则的敏感性。不是通过 Unicode 字符串识别记录,而是让数据库模式在您插入记录时为您生成无意义的连续整数,并将 Unicode 字符串降级为记录的纯粹属性。这样,它们可以根据您的喜好相同或不同。
为了搜索和更安全的后续处理,在存储之前对它们进行规范化可能仍然有用;但是您使用的特定不区分大小写的排序规则将不再以任何方式限制您。
1在兼容性规范化与规范规范化的情况下几乎相同。