Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 替换双字符unicode_Python_Unicode - Fatal编程技术网

Python 替换双字符unicode

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

这应该是微不足道的,但。。。!我正在给一个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:

十六进制编辑器:

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
number
U+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,以查看这是否是核心问题。if
unicode_文字
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