我对编码/解码部分非常陌生,想知道为什么...我有字典,不知道为什么在添加密钥的情况下需要应用规范化?它与上一个密钥和新密钥有关吗?如果我不规范怎么办?
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))
答案 0 :(得分:2)
标准化不是关于编码和解码,而是表示字符的“正常”(预期)形式。
经典示例是关于带有重音符号的字符。此类字符通常具有两种表示形式,一种具有基本字符编码点,然后具有描述重音符号的组合编码点,第二种通常只有一个编码点(描述字符和重音符号)。
此外,有时您会带有两个或多个重音符号(以及下降点,圆点等)。在这种情况下,您可能希望按特定的顺序进行操作。
Unicode添加新的字符和代码点。您可能有一些古老的印刷方式来描述字母(或汉字)。在某些情况下(显示),区分是很重要的(在英语中,过去的字母s
也有两种表示形式),但是阅读或分析时,一个人想要语义字母(因此已标准化)。>
在少数情况下,您可能会有不必要的字符(例如,如果您输入“ Unicode键盘”)。
那为什么我们需要规范化?
最简单的情况:我们应该比较字符串:在视觉上和语义上,相同的字符串可以表示为不同的形式,因此我们选择规范化形式,以便可以比较字符串。
排序规则(排序)算法工作得更好(少一些特殊情况),如果我们既要处理一种形式,又要改变大小写(小写,大写),最好有一个表格来处理。
处理字符串会更容易:如果要删除重音符号,最简单的方法是使用分解形式,然后删除组合字符。
要以其他字符集进行编码,最好使用复合形式(或同时使用这两种形式):如果目标字符集具有复合形式,则对其进行转码,否则:有很多处理方式。
因此,“规范化”是指将相同字符串转换为唯一的Unicode表示形式。规范转换使用严格的 same 定义;相反,兼容性规范化将先前的 same 解释为*,如果我们遵循Unicode哲学,它应该是相同的,但实际上,我们必须做出与 preferred 不同的一些代码点。 em>一个*。因此,在兼容性规范化中,我们可能会丢失一些语义,并且 pure / ideal Unicode字符串不应具有“ compatibility”字符。
在您的情况下:csv文件可以由不同的编辑器进行编辑,因此在表示重音字符方面存在不同的约定。因此,通过规范化,您可以确保将相同的密钥编码为字典中的相同条目。