2008-11-18 134 views
14

这主要是一个我只是很好奇的理论问题。 (我没有试图通过编码它自己或任何东西来做到这一点,我不是在重新发明轮子。)如何在Unicode中将字符串设置为大写/小写?

我的问题是大写/小写表格的等效性如何适用于Unicode。例如,如果我必须使用ASCII来做这件事,我会选择一个角色,如果它与[a-z]范围一起下降,我会总结A和a之间的差异。

如果它不在这个范围内,我会为10个左右重音字符加上一个小等价表。 (或者,我可以只有一个完整的等值数组,256条目,其中大部分将与输入相同)

但是,我猜测有更好的方式来指定Unicode中的等价性,给定有成千上万的角色,并且从理论上讲,可以添加一种新的语言或一组角色(并且我期望在发生这种情况时您不需要修补窗口)。

Windows对每个字符都有一个巨大的硬编码等价表吗?或者这是如何实施的?

一个相关的问题是SQL Server如何实现基于Unicode的重音不敏感和不区分大小写的查询。它是否有一个内部表格,告诉它它和E都等于“e”?

在比较字符串时听起来不太快。

它如何快速访问索引?它是否已将索引值转换为其“基本”字符,与该字段的整理对应?

有没有人知道这些东西的内部?

谢谢!

+0

我希望如果他们给unicode添加了一个新的字符集,那么你需要补丁窗口,但是这将是一个非常低优先级的补丁,因为最初没有人会使用这些字符。 – 2008-11-18 02:40:03

+0

“为10个左右重音字符加上一个小等价表加上 - ” - 你必须明白,“小”意味着大约100倍于你认为的意思。 – 2008-11-18 03:30:54

回答

11

有一个映射文件,其中包含所有具有1:1映射比率的大小写映射。通常操作系统/框架/库支持特定版本的Unicode,并且由于这个案例映射文件是版本化的,所以你会得到你的特定OS /框架/库/无论支持哪种版本的Unicode的映射。

有关Unicode案件映射的详细信息,请参阅:http://www.unicode.org/faq/casemap_charprop.html

3

大多数书写系统没有单独的大写和小写字母。根据维基百科,例外包括“罗马,希腊,西里尔和亚美尼亚字母”。

所以没有那么多字母需要担心。 This page显示大范围的字符遵循一个简单的方案,即将大写字符加1以获得小写等效(尽管当然有一些例外)。

16

我要解决这个问题的MS SQL Server部分,但“正确的”答案实际上取决于支持的语言和应用程序。

当您在SQL Server中创建表时,每个文本字段都具有隐式或显式指定的排序规则。这会影响排序顺序和比较行为。大多数英语(美国)语言环境的默认值为Latin1_General_CI_AS,或Latin 1,不区分大小写,强调敏感。这意味着,例如,a = A,但a!=Ä和a!=ä。您还可以使用不区分重音的(Latin1_General_CI_AI),它将“A”的所有变音变体视为相等。

一些语言环境支持其他类别的比较;例如,法国命令含有变音符号的单词与德语有些不同。土耳其语认为无点我和点缀我的语义不同,所以如果您使用土耳其语,不区分大小写,区分变音的归类,我和我即使不区分大小写也不匹配。

您可以更改每个数据库,每个表,每个字段的排序规则以及一些成本甚至每个查询的排序规则。我的理解是索引按照指定的整理顺序进行规范化,这意味着索引基本上保持了原始字符串的扁平化版本。例如,对于不区分大小写的排序规则,Apple和Apple被存储为Apple。在搜索之前,使用相同的排序规则将查询展平。

在日语中,还有另一类规范化,其中全角和半角字符(如ア=ア),以及在某些情况下,两个半角字符被平化为单个语义等同字符(バ=バ)。最后,对于某些语言来说,还有另一个带有复合字符的蜡球,其中独立的变音符可以与其他字符合成(例如,ä中的变音符是一个字符,由简单的形式a组成)。越南语,泰语和其他几种语言都有此类别的变体。如果存在规范形式,则Unicode规范化允许组合和分解形式被视为等同形式。 Unicode规范化通常在进行任何比较之前应用。总结一下,对于不区分大小写的比较,您可以做比较比较ASCII范围字符串时的操作:将比较的左侧和右侧平铺为“小写”(例如),然后比较数组作为二进制数组。不同的是,你需要 1)将字符串规范化为相同的Unicode格式(kC或kD) 2)根据该区域的规则将字符串规范化为相同的大小写3)根据重音规范化口音灵敏度规则 4)根据二进制比较进行比较4)如果适用,例如在排序的情况下,使用附加的二级和三元排序规则进行比较,其中包括类似于诸如“Mc”之类的事物在“M”之前排序的事物在某些语言中。

是的,Windows存储所有这些规则的表。除非您通过控制面板的东亚语言支持和复杂脚本支持添加对它们的支持,否则在每次安装中都没有默认使用它们。

1

正确答案稍微复杂一点,具体取决于您要做什么。

当比较字符串时,为了排序或搜索应用程序,要使用的正确算法在UTS #10: "Unicode Collation Algorithm".中指定。不区分大小写是混合的一部分,但表示多个字符的方式不同,应用程序经常需要处理各种表述等同。

排序规则是区域设置相关的。当您对结果进行排序以显示给用户时,这主要是一个问题。忽略规则可能会挫败用户,甚至导致安全漏洞。

如果您只是为显示目的而尝试大写单词,那么规则可能会非常棘手;有一对多的转换和其他问题。根据区域设置的不同,相同的字母可能会大写。字母在单词中的位置可以有所作为。还有一个明显的“标题案例”的概念,你只想把每个单词的首字母大写。有时角色的标题大小写与大写字母不一样。

相关问题