unicodedata中的规范化是什么意思?

时间:2019-08-16 01:11:41

标签: python python-3.x dictionary unicode normalization

我对编码/解码部分非常陌生,想知道为什么...我有字典,不知道为什么在添加密钥的情况下需要应用规范化?它与上一个密钥和新密钥有关吗?如果我不规范怎么办?

with open('file.csv') as input_file:
    reader = csv.DictReader(input_file)

    for row in reader:

        pre_key = ['One sample', 'Two samples', 'Three samples']
        new_key = ['one_sample', 'two_Samples', 'three_samples']
        my_dict['index'][new_key] = unicodedata.normalize("NFKD", 
        row.get(pre_key, None))

1 个答案:

答案 0 :(得分:2)

标准化不是关于编码和解码,而是表示字符的“正常”(预期)形式。

经典示例是关于带有重音符号的字符。此类字符通常具有两种表示形式,一种具有基本字符编码点,然后具有描述重音符号的组合编码点,第二种通常只有一个编码点(描述字符和重音符号)。

此外,有时您会带有两个或多个重音符号(以及下降点,圆点等)。在这种情况下,您可能希望按特定的顺序进行操作。

Unicode添加新的字符和代码点。您可能有一些古老的印刷方式来描述字母(或汉字)。在某些情况下(显示),区分是很重要的(在英语中,过去的字母s也有两种表示形式),但是阅读或分析时,一个人想要语义字母(因此已标准化)。

在少数情况下,您可能会有不必要的字符(例如,如果您输入“ Unicode键盘”)。

那为什么我们需要规范化?

  • 最简单的情况:我们应该比较字符串:在视觉上和语义上,相同的字符串可以表示为不同的形式,因此我们选择规范化形式,以便可以比较字符串。

  • 排序规则(排序)算法工作得更好(少一些特殊情况),如果我们既要处理一种形式,又要改变大小写(小写,大写),最好有一个表格来处理。

  • 处理字符串会更容易:如果要删除重音符号,最简单的方法是使用分解形式,然后删除组合字符。

  • 要以其他字符集进行编码,最好使用复合形式(或同时使用这两种形式):如果目标字符集具有复合形式,则对其进行转码,否则:有很多处理方式。

因此,“规范化”是指将相同字符串转换为唯一的Unicode表示形式。规范转换使用严格的 same 定义;相反,兼容性规范化将先前的 same 解释为*,如果我们遵循Unicode哲学,它应该是相同的,但实际上,我们必须做出与 preferred 不同的一些代码点。 em>一个*。因此,在兼容性规范化中,我们可能会丢失一些语义,并且 pure / ideal Unicode字符串不应具有“ compatibility”字符。

在您的情况下:csv文件可以由不同的编辑器进行编辑,因此在表示重音字符方面存在不同的约定。因此,通过规范化,您可以确保将相同的密钥编码为字典中的相同条目。

相关问题