我在python3中使用CSV模块。我打开我的输出文件
open(file_name, 'w', encoding="ascii", errors="backslashreplace")
然后将Unicode字符串写入文件。Unicode字符替换为十六进制表示,例如:
f\xfcr
不幸的是,我的解析器(JavaScript)不理解这种表示,需要类似
f\u00FCr
而是(4位数表示)。有什么聪明的方法来实现这一点,还是我必须重新打开文件,找到所有发生的并自己更改它们?在
澄清:我不想使用utf-8编码,因为JavaScript解析器无法理解它。我需要转义Unicode字符!在
处理这样一个愚蠢的解析器是多么不幸;它似乎将CSV数据视为JSON数据,而不是正确地处理编码数据。这不是一个标准。在
您可以将每个值编码为JSON,然后去掉引号:
这是因为JSON(几乎完全)是Javascript的超集(当将默认的
ensure_ascii
设置为True
时,Python解析器永远不会生成这个超集)。在backslashreplace
无法工作,因为只有从U+0100到U+D7FF和U+E000-U+FFFF的Unicode码点被编码为\uhhhh
转义。超出这些范围的代码点要么已经是ASCII,编码为较短的转义码(\n
,\xhh
,等等),要么是更长的转义码(\Uhhhhhhhh
表示超过U+FFFF
)。在另一方面,
json
编码器只会产生\uhhhh
转义码,对U+FFFF上的码位使用UTF-16 surrogate pairs。在演示:
^{pr2}$因此,有效的CSV是通过转换成
\uhhhh
序列的ASCII范围之外的任何内容生成的。在注意,换行符也将被编码(到
\n
),但是如果解析器将数据作为JSON或Javascript文本处理,那么这应该不是问题。在相关问题 更多 >
编程相关推荐