Python 替换双字符unicode
这应该是微不足道的,但。。。!我正在给一个UTF-8编码的文件写信,文本包括“科特迪瓦”。据我所知,“ô”是U+00F4。字符在任何地方都能正确显示,但在文件中以U+C3B4结尾,该字符应位于Unicode块HANGUL_音节(“쎴"). 任何用U+00F4替换U+C3B4的尝试似乎都不会改变任何东西——下面文件的所有四行都包含它 这就产生了一个问题,因为当文件最终写入数据库时,它会显示为“Côte d'Ivodia” 更新:如果我使用io.open(“Test.html”,“w”)作为f_out:在下面,那么文件包含正确的U+00F4,它显示为“?”,最终的数据库记录仍然显示为“Côte d'Ivoid”,尽管:-( MWE: 十六进制编辑器:Python 替换双字符unicode,python,unicode,Python,Unicode,这应该是微不足道的,但。。。!我正在给一个UTF-8编码的文件写信,文本包括“科特迪瓦”。据我所知,“ô”是U+00F4。字符在任何地方都能正确显示,但在文件中以U+C3B4结尾,该字符应位于Unicode块HANGUL_音节(“쎴"). 任何用U+00F4替换U+C3B4的尝试似乎都不会改变任何东西——下面文件的所有四行都包含它 这就产生了一个问题,因为当文件最终写入数据库时,它会显示为“Côte d'Ivodia” 更新:如果我使用io.open(“Test.html”,“w”)作为f_o
00000000h: 54 68 65 20 63 75 72 72 65 6E 74 20 70 6F 70 75 ; The current popu
00000010h: 6C 61 74 69 6F 6E 20 6F 66 20 43 C3 B4 74 65 20 ; lation of Côte
00000020h: 64 27 49 76 6F 69 72 65 20 69 73 20 32 36 2C 30 ; d'Ivoire is 26,0
00000030h: 35 31 2C 32 39 31 0D 0A 54 68 65 20 63 75 72 72 ; 51,291..The curr
00000040h: 65 6E 74 20 70 6F 70 75 6C 61 74 69 6F 6E 20 6F ; ent population o
00000050h: 66 20 43 C3 B4 74 65 20 64 27 49 76 6F 69 72 65 ; f Côte d'Ivoire
00000060h: 20 69 73 20 32 36 2C 30 35 31 2C 32 39 31 0D 0A ; is 26,051,291..
00000070h: 54 68 65 20 63 75 72 72 65 6E 74 20 70 6F 70 75 ; The current popu
00000080h: 6C 61 74 69 6F 6E 20 6F 66 20 43 C3 B4 74 65 20 ; lation of Côte
00000090h: 64 27 49 76 6F 69 72 65 20 69 73 20 32 36 2C 30 ; d'Ivoire is 26,0
000000a0h: 35 31 2C 32 39 31 0D 0A 54 68 65 20 63 75 72 72 ; 51,291..The curr
000000b0h: 65 6E 74 20 70 6F 70 75 6C 61 74 69 6F 6E 20 6F ; ent population o
000000c0h: 66 20 43 C3 B4 74 65 20 64 27 49 76 6F 69 72 65 ; f Côte d'Ivoire
000000d0h: 20 69 73 20 32 36 2C 30 35 31 2C 32 39 31 0D 0A ; is 26,051,291..
右-您正在混合苹果和橙子,即Unicode代码点(用符号表示
U+XXXX
)和字节(用pythonical符号表示\xXX
)
如果你真的想写一个UTF-8文件,那么你基本上就完成了!你在写UTF-8,其中
ô
恰好是一个编码成两个字节的字符。你使用的是什么版本的Python?@ben quigley Python 3.7.3(v3.7.3:ef4ec6ed12,2019年3月25日,22:22:05)[MSC v.1916 64位(AMD64)]在win32上,这个字符有UNICODE
numberU+00F4
但是UTF-8
code\xC3\xB4
-UTF-8
并不意味着UNICODE
@furas感谢-这开始解释问题的产生。我该如何解决它?你只是误解了UTF-8的工作原理。两个字节\xC3\xB4编码U-00F4,而不是U+C3B4。谢谢。但是我读了一个UTF-8文件,从中提取信息,然后将输出写入UTF-8文件。在这个过程中的某个地方,可读的“ô”输入自动转换为“ô´t”,我不知道在哪里(或者如何反向转换它)。然后,我们需要查看您的读取、提取和编写代码。很可能您正在读取UTF-8文件,就好像它是ISO-8859-15或类似文件一样,从而导致了mojibake。从将来的导入中取出unicode_文字似乎有部分帮助。我现在正在删除iat,以查看这是否是核心问题。ifunicode_文字
ha一个效果,你使用Python 2,你真的应该考虑升级到Python 3,其中Unicode更严格,更不痛苦。我肯定在Python 3.7.3。我只把UnicoDeI文字作为一个实验,它似乎在测试文件中引起了一个“。”
00000000h: 54 68 65 20 63 75 72 72 65 6E 74 20 70 6F 70 75 ; The current popu
00000010h: 6C 61 74 69 6F 6E 20 6F 66 20 43 C3 B4 74 65 20 ; lation of Côte
00000020h: 64 27 49 76 6F 69 72 65 20 69 73 20 32 36 2C 30 ; d'Ivoire is 26,0
00000030h: 35 31 2C 32 39 31 0D 0A 54 68 65 20 63 75 72 72 ; 51,291..The curr
00000040h: 65 6E 74 20 70 6F 70 75 6C 61 74 69 6F 6E 20 6F ; ent population o
00000050h: 66 20 43 C3 B4 74 65 20 64 27 49 76 6F 69 72 65 ; f Côte d'Ivoire
00000060h: 20 69 73 20 32 36 2C 30 35 31 2C 32 39 31 0D 0A ; is 26,051,291..
00000070h: 54 68 65 20 63 75 72 72 65 6E 74 20 70 6F 70 75 ; The current popu
00000080h: 6C 61 74 69 6F 6E 20 6F 66 20 43 C3 B4 74 65 20 ; lation of Côte
00000090h: 64 27 49 76 6F 69 72 65 20 69 73 20 32 36 2C 30 ; d'Ivoire is 26,0
000000a0h: 35 31 2C 32 39 31 0D 0A 54 68 65 20 63 75 72 72 ; 51,291..The curr
000000b0h: 65 6E 74 20 70 6F 70 75 6C 61 74 69 6F 6E 20 6F ; ent population o
000000c0h: 66 20 43 C3 B4 74 65 20 64 27 49 76 6F 69 72 65 ; f Côte d'Ivoire
000000d0h: 20 69 73 20 32 36 2C 30 35 31 2C 32 39 31 0D 0A ; is 26,051,291..
>>> l = "ô" # our text to be ebcoded
>>> "U+%04x" % ord(l)
'U+00f4' # the code point (ordinal encoded in hex)
>>> l.encode("utf-8")
b'\xc3\xb4' # the UTF-8 encoded bytes