以未知编码写入数据
Write data in unknown encoding
是否可以将数据写入未知编码的文件?
我无法解码电子邮件 headers,例如 message-id,因为如果我使用处理程序忽略或替换
https://docs.python.org/3/library/codecs.html#error-handlers
non-RFC header 将是 RFC-compliant 并且反垃圾邮件不会增加垃圾邮件分数。
我从 milter 协议中的后缀获取字符串。我无法为反垃圾邮件保存此数据不变,引发 UnicodeError。示例:
cat 存档文件
#!/usr/bin/python3
import sys
fh = open('test', 'w+')
fh.write(sys.argv[1])
echo žlutý | xargs ./savefile && cat test
žlutý
echo žlutý | iconv -f UTF-8 -t ISO8859-2 - | xargs ./savefile
Traceback (most recent call last):
File "/root/./savefile", line 5, in <module>
fh.write(sys.argv[1])
UnicodeEncodeError: 'utf-8' codec can't encode character '\udcbe' in position 0: surrogates not allowed
输入的可能是很多未知的编码。 python2 中的 Milter 应用程序运行良好。
然后你想处理原始 bytes
,而不是字符串。 open
二进制模式的输出文件。请注意:
sys.argv
..
Note: On Unix, command line arguments are passed by bytes from OS. Python decodes them with filesystem encoding and “surrogateescape” error handler. When you need original bytes, you can get it by [os.fsencode(arg) for arg in sys.argv]
.
所以:
import sys
import os
with open('test', 'wb+') as fh:
fh.write(os.fsencode(sys.argv[1]))
是否可以将数据写入未知编码的文件? 我无法解码电子邮件 headers,例如 message-id,因为如果我使用处理程序忽略或替换 https://docs.python.org/3/library/codecs.html#error-handlers non-RFC header 将是 RFC-compliant 并且反垃圾邮件不会增加垃圾邮件分数。
我从 milter 协议中的后缀获取字符串。我无法为反垃圾邮件保存此数据不变,引发 UnicodeError。示例:
cat 存档文件
#!/usr/bin/python3
import sys
fh = open('test', 'w+')
fh.write(sys.argv[1])
echo žlutý | xargs ./savefile && cat test
žlutý
echo žlutý | iconv -f UTF-8 -t ISO8859-2 - | xargs ./savefile
Traceback (most recent call last):
File "/root/./savefile", line 5, in <module>
fh.write(sys.argv[1])
UnicodeEncodeError: 'utf-8' codec can't encode character '\udcbe' in position 0: surrogates not allowed
输入的可能是很多未知的编码。 python2 中的 Milter 应用程序运行良好。
然后你想处理原始 bytes
,而不是字符串。 open
二进制模式的输出文件。请注意:
sys.argv
..
Note: On Unix, command line arguments are passed by bytes from OS. Python decodes them with filesystem encoding and “surrogateescape” error handler. When you need original bytes, you can get it by
[os.fsencode(arg) for arg in sys.argv]
.
所以:
import sys
import os
with open('test', 'wb+') as fh:
fh.write(os.fsencode(sys.argv[1]))