[英]Writing unicode characters to file in Python
取得以下样本数据(可在此处找到整个列表):
Ω≈ç√∫˜µ≤≥÷
åß∂ƒ©˙∆˚¬…æ
œ∑´®†¥¨ˆøπ“‘
¡™£¢∞§¶•ªº–≠
¸˛Ç◊ı˜Â¯˘¿
ÅÍÎÏ˝ÓÔÒÚÆ☃
Œ„´‰ˇÁ¨ˆØ∏”’
ヽ༼ຈل͜ຈ༽ノ ヽ༼ຈل͜ຈ༽ノ
(。◕ ∀ ◕。)
`ィ(´∀`∩
_ _ロ(,_,*)
・( ̄∀ ̄)・:*:
我一直将数据从前述的字符串转储输出到单独的HTML文件中(无需详细介绍,因为这与问题无关),如下所示:
for value in tags['tags']:
for line in data:
with open('./output/fuzzml' + str(file_count), 'w') as output:
parsed_string = value.replace('[[VAR]]', u''.join(line.rstrip()))
output.write(parsed_string)
file_count += 1
在碰到一些棘手的符号(例如上面的符号)之前,它对于数据转储的一小部分效果很好。 我多次修改了第5行( u''.join(line.rstrip())
),希望以一种可以正确输出任何内容的方式编写,但是它总是会卡在某个点上,并会引发UnicodeDecodeError
异常:
Traceback (most recent call last):
File "generate-html.py", line 37, in <module>
main()
File "generate-html.py", line 34, in main
generate_html(tag_file, data_file)
File "generate-html.py", line 18, in generate_html
parsed_string = value.replace('[[VAR]]', u''.join(line.rstrip()))
UnicodeDecodeError: 'ascii' codec can't decode byte 0xce in position 0: ordinal not in range(128)
tags
是从具有以下示例集的JSON文件中提取的:
"tags": [
"<img src=\"[[VAR]]\">",
"<a href=\"[[VAR]]\"><img src=\"[[VAR]]\">",
"<script>[[VAR]]</script>",
"<[[VAR]]>Hello World<[[VAR]]>"
]
data
只是上述链接/样本数据中的原始字符串。
问题在于您在这里对u''.join()
:
u''.join(line.rstrip())
这是毫无用处的。 它将字符串分解为单个字符,然后再次将其重新合并为unicode
字符串。 您可能打算这样做的副作用:隐式转换为unicode
字符串。
您可以通过以下方式获得相同的效果:
unicode(line.rstrip())
它将因完全相同的错误而失败,因为这两个版本都不会告诉Python字节串使用了哪种编解码器来编码您的字符。
明确地解码行; 链接到的文件编码为UTF-8:
unicode(line.rstrip(), 'utf-8')
要么
line.rstrip().decode('utf-8')
下一个问题是您的parsed_string
对象现在也是Unicode对象,因此在写入文件时需要再次对其进行编码:
output.write(parsed_string.encode('utf8'))
或使用io.open()
函数打开一个在编写时为您编码Unicode字符串的文件对象。
您可能需要阅读:
Ned Batchelder的实用Unicode
每个软件开发人员绝对,肯定必须绝对了解Unicode和字符集(无借口!)作者:Joel Spolsky
在继续全面了解Python和Unicode如何协同工作之前。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.