好的,当您使用Python2版本时,您将文件作为字节字符串读取,您的代码应该成功地转换µ(U+00B5)或{}(U+00B1)的所有utf-8编码版本。在
这与你后来所说的一致:my current code only catches the incorrect version, letting the correct one pass through
事实上,这是完全正确的。让我们先看看µ到底发生了什么。µ是u'\u00b5'它在utf-8中编码为'\xc2\xb5',在拉丁1或cp1252中编码为'\xb5'。由于'Â'是U+00C2,它的拉丁1或cp1252代码是0xc2。这意味着在windows1252系统中,正确编码为utf-8的µ字符将读作µ。当它看起来是正确的,那是因为它不是utf-8编码的,而是拉丁1编码的。在
看起来您正在尝试处理一个文件,其中部分是utf-8编码的,而其他部分是Latin1(或cp1252)编码的。您确实应该尝试在收集数据的系统中修复此问题,因为它可能会导致难以恢复的问题。在
好消息是,它可以在这里修复,因为你只想处理2个非ASCII字符:你只需要像你一样尝试解码utf-8版本,然后再尝试第二次解码拉丁1版本。代码可以是(此处不需要regex):def stripChars(string):
outString = string.replace('\xc2\xb5','micro') #Metric 'micro (10^-6)' (Greek 'mu') letter in utf-8
outString = outString.replace('\xb5','micro') #Metric 'micro (10^-6)' (Greek 'mu') letter in Latin1
outString = outString.replace('\xc2\xb1','+/-') #Scientific 'Plus-Minus' symbol in utf-8
outString = outString.replace('\xb1','+/-') #Scientific 'Plus-Minus' symbol in Latin1
return outString
对于引用,Latin1也称为ISO-8859-1编码对于256以下的所有unicode字符具有精确的unicode值。windowcodepage1252(Python中的cp1252)是Latin1编码的Windows变体,其中一些在Latin1中通常未使用的字符用于更高级的代码字符。例如,€(U+20AC)在cp1252中被编码为'\80',而它在Latin1中根本不存在。在