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

What does normalize in unicodedata means?

我是 encoding/decoding 部分的新手,想知道为什么...我有一本字典,我想知道为什么在添加密钥时需要在这种情况下应用规范化?跟之前的key和新的key有关系吗?如果我不正常化会怎样?

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))

规范化与编码和解码无关,而是表示字符的 "normal"(预期)形式。

经典的例子是一个带有口音的角色。这些字符通常有两种表示形式,一种是基本字符代码点,然后是描述重音的组合代码点,第二种通常只有一个代码点(描述字符和重音)。

此外,有时您有两种或多种口音(以及后裔、圆点等)。在这种情况下,您可能希望它们按特定顺序排列。

Unicode 添加新字符和代码点。你可能有一些旧的印刷方式来描述一个字母(或汉字)。在某些上下文(显示)上区分是很重要的(同样在英语中,在过去的字母 s 中有两种表示),但是要阅读或分析,一个是要语义字母(如此规范化)。

并且在极少数情况下您可能会有不必要的字符(例如,如果您输入 "unicode keyboard")。

那么为什么我们需要归一化?

  • 简单的情况:我们应该比较字符串:在视觉上和语义上,同一个字符串可以表示为不同的形式,所以我们选择一种规范化形式,这样我们就可以比较字符串。

  • collat​​ion(排序)算法效果好很多(特殊情况少),如果我们只需要处理一种形式,还要改变大小写(小写,大写),那就更好了有一个单一的表格来处理。

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

  • 要在其他字符集中编码,最好有复合形式(或两者):如果目标字符集有复合形式,请转码,否则:有很多方法可以处理.

所以"normalize"的意思是将相同的字符串转换成唯一的Unicode表示。规范转换使用same的严格定义;相反,兼容性规范化将之前的 same 解释为 *它应该是相同的,如果我们遵循 Unicode 哲学,但实践中我们必须使一些代码点不同于 首选一个*。所以在兼容性规范化中我们可能会丢失一些语义,pure/ideal Unicode 字符串永远不应该有 "compatibility" 字符。

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