强制Python使用4位Unicode编码(CSV Writer)

2024-09-29 21:53:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我在python3中使用CSV模块。我打开我的输出文件

open(file_name, 'w', encoding="ascii", errors="backslashreplace")

然后将Unicode字符串写入文件。Unicode字符替换为十六进制表示,例如:

f\xfcr

不幸的是,我的解析器(JavaScript)不理解这种表示,需要类似

f\u00FCr

而是(4位数表示)。有什么聪明的方法来实现这一点,还是我必须重新打开文件,找到所有发生的并自己更改它们?在

澄清:我不想使用utf-8编码,因为JavaScript解析器无法理解它。我需要转义Unicode字符!在


Tags: 模块文件csvname解析器asciiunicodeopen
1条回答
网友
1楼 · 发布于 2024-09-29 21:53:02

Clarification: I don't want to use the utf-8 encoding because the JavaScript parser doesn't understand it.

处理这样一个愚蠢的解析器是多么不幸;它似乎将CSV数据视为JSON数据,而不是正确地处理编码数据。这不是一个标准。在

您可以将每个值编码为JSON,然后去掉引号:

import json, csv

def json_escaped(obj):
    res = json.dumps(obj)
    if res[0] == res[-1] == '"':
        res = res[1:-1]
    return res

with open(file_name, 'w', newline='') as outfile:
    writer = csv.writer(outfile)
    for row in source:
        writer.writerow(map(json_escaped, row))

这是因为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文本处理,那么这应该不是问题。在

相关问题 更多 >

    热门问题