为什么要在出路时重新组合Unicode(NFC)?

时间:2012-04-04 13:41:06

标签: perl unicode

TomC建议在进入时分解Unicode字符,并在出路时重新组合(http://www.perl.com/pub/2012/04/perl-unicode-cookbook-always-decompose-and-recompose.html)。

前者对我来说很有意义,但我不明白为什么他建议在出路时重新组合。如果你的文字很重,有欧洲重音字符,你可能会节省少量空间,但你只是把它推到别人的分解功能上。

我还缺少其他明显的理由吗?

5 个答案:

答案 0 :(得分:5)

正如Ven'Tatsu在评论中写道,有一些软件可以处理组合字符而不是分解字符。虽然理论上反过来也是相反的,但我从未在实践中看到它并期望它很少见。

为了只显示一个分解的字符,渲染软件需要处理组合变音符号。在字体中找到它们是不够的。渲染器需要使用有关基本字符尺寸的信息正确定位变音符号。这经常会出现问题,导致渲染效果不佳 - 特别是如果渲染使用不同字体的变音符号!结果几乎不会比通过简单地显示由印刷师设计的预先组合字符(如“é”)的字形所实现的效果好。

(渲染软件还可以分析情况并有效地将分解后的角色映射到预先组合的角色。但这需要额外的代码。)

答案 1 :(得分:2)

这很简单:大多数工具都支持有限的Unicode;他们认为角色是NFC形式。

例如,这通常是人们比较字符串的方式:

perl -CSDA -e"use utf8; if ($ARGV[0] eq "Éric") { ... }"

当然,“É”是NFC形式(因为这几乎是一切产生的),所以这个程序只接受NFC形式的参数。

答案 2 :(得分:0)

它会使文本编辑器之类的东西变得更简单,因为最终用户希望一个可见字符是一个字符而不是几个字符。它还可以防止不将分解的字符视为“单个”字符的系统出现问题。

除此之外,我没有看到特别的优势。

答案 3 :(得分:0)

您应该使用一个规范化表单,以便所有数据都具有相同的规范化,那么为什么不选择可能较短的数据呢?

对于其他人的分解,请记住,您希望对所输出的内容严格要求,但要接受自由。 :)

答案 4 :(得分:-3)

Tom Christiansen是StackOverflow的积极参与者,并回答了很多Perl问题。他很有可能回答这个问题。

某些字符序列(如ff)可以UTF-8表示为两个Unicode字符ff,或者作为单个Unicode字符(ff)表示。当你分解你的角色时,你会让像ff这样的东西变成两个独立的角色,这对于排序很重要。排序时,您希望这是两个单独的字母f

当您重新组合UTF-8 ff时,它们会回到单个UTF-8字符,这对于显示(您希望它们格式化很好)和编辑(您想要将其编辑为单个字符。)

不幸的是,我的理论因西班牙语而崩溃。这表示为U + 00F1作为单个字符,并分解为U + 006E(n)和U + 0303(就地〜)。也许Perl内置了逻辑来处理这种类型的两个UTF-8分解字符表示。