Javascript 强制Python使用4位Unicode编码(CSV编写器)
我在Python3中使用CSV模块。我打开我的输出文件Javascript 强制Python使用4位Unicode编码(CSV编写器),javascript,python,csv,unicode,Javascript,Python,Csv,Unicode,我在Python3中使用CSV模块。我打开我的输出文件 open(file_name, 'w', encoding="ascii", errors="backslashreplace") 然后将Unicode字符串写入文件。Unicode字符替换为十六进制表示,例如: f\xfcr 不幸的是,我的解析器(JavaScript)不理解这种表示,需要类似 f\u00FCr 取而代之的是(4位数字表示)。是否有一些聪明的方法来实现这一点,或者我必须重新打开该文件,找到所有出现的情况,并自行更改它们
open(file_name, 'w', encoding="ascii", errors="backslashreplace")
然后将Unicode字符串写入文件。Unicode字符替换为十六进制表示,例如:
f\xfcr
不幸的是,我的解析器(JavaScript)不理解这种表示,需要类似
f\u00FCr
取而代之的是(4位数字表示)。是否有一些聪明的方法来实现这一点,或者我必须重新打开该文件,找到所有出现的情况,并自行更改它们
澄清:我不想使用utf-8编码,因为JavaScript解析器不理解它。我需要转义Unicode字符
澄清:我不想使用utf-8编码,因为JavaScript解析器不理解它
处理这样一个愚蠢的解析器是多么不幸;它似乎将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的超集(Python解析器在将默认的设置设为True
时永远不会生成)
反斜杠替换
无法工作,因为只有从U+0100到U+D7FF和U+E000-U+FFFF的Unicode代码点被编码为\uhhh
转义。超出这些范围的代码点要么已经是ASCII码,编码为较短的转义码(\n
,\xhh
,等等),要么是较长的转义码(\uhhhhhhh
,用于U+FFFF
)
另一方面,json
编码器将只产生\uhhh
转义码,用于U+FFFF上的码点
演示:
因此,将ASCII范围之外的任何内容转换为\uhhh
序列,即可生成有效的CSV
请注意,换行符也将被编码(到\n
),但是如果您的解析器将数据视为JSON或Javascript文本,那么这应该不会是一个问题。我认为您正在寻找“unicode转义”编码。更改encoding=“ascii”
的encoding=“utf-8”
是否可以做到这一点?不,然后我就明白了“für”使我的JS解析器崩溃。我需要\u编码。@PM2Ring这如何与CSV模块一起工作?不幸的是,“unicode转义”编码为\u007f
到\u00ff
范围内的字符生成\x
编码。但是,您可以使用json.dumps
创建JavaScript友好字符串。它将接受单个字符串,以及dict、list或tuple。例如,importjson;print(json.dumps('für'))
打印“f\u00fcr”
确保默认值为_ascii=True,因此无需指定它
>>> import csv
>>> from io import StringIO
>>> data = [3.14, 'Unicode face: \u0669(-\u032e\u032e\u0303\u2022\u0303.', 'Something with a non-BMP emoji: \U0001F47D']
>>> with StringIO() as output:
... writer = csv.writer(output)
... writer.writerow(map(json_escaped, data))
... print(output.getvalue())
...
105
3.14,Unicode face: \u0669(-\u032e\u032e\u0303\u2022\u0303.,Something with a non-BMP emoji: \ud83d\udc7d