Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.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
Javascript 强制Python使用4位Unicode编码(CSV编写器)_Javascript_Python_Csv_Unicode - Fatal编程技术网

Javascript 强制Python使用4位Unicode编码(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位数字表示)。是否有一些聪明的方法来实现这一点,或者我必须重新打开该文件,找到所有出现的情况,并自行更改它们

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

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