我的程序是这样的,它接收一个字符串,然后尝试将该字符串写入文件。我认为问题是字符串有特殊字符(ü,ç等)。
当我尝试将字符串写入文件时,我得到编译器错误(或类似的东西):
UnicodeEncodeError: 'charmap' codec cannot encode character '\u200b' in position 16: character maps to <undefined>
然后我写了一个看起来像这样的函数:
def try_encode(info):
if info is None:
return None
temp = (str(info.encode('utf-8'))).replace("\n","")
return '"' + temp[2:len(temp)-1] + '"'
(我想摆脱所有新行并写下用引号括起来的字符串)
但是我运行这个问题时,程序运行后,我打开的文件中有一些奇怪的字符,所有字符都以:\x
这些字符的一些例子是:
\xc3, \xa9p, \xaa, \xe2, \x80, etc
我认为这些与我上面提到的特殊字符相对应。我已尝试过不同的编码(utf-16和utf-7),但它们都没有帮助或使这些角色更常见。谁能帮助我弄清楚如何摆脱这些?
编辑:包括我打开文件的代码:
f = open(filename, "w")
答案 0 :(得分:0)
你做错了事。
有字符串,并且有字符串的二进制表示(也称为编码。一个应该使用字符串,只是在编写(和阅读)时应该转换二进制(编码)文本到Unicode文本(抽象,忽略Python语言中字符串的内部表示)。
你的str(info.encode('utf-8'))
没有多大意义:你告诉python将信息编码为UTF-8,然后再用UTF-8解码它(它是{{1}的默认encoding
}})。
str
try_encode`“:它没有编码。
所以这个问题不是关于这个(破碎的)函数,而是关于如何保存/打印python字符串。在Unix / Linux / MacO上你默认使用UTF-8,但我希望你在Windows中,并且没有真正的默认值(它取决于本地配置)。所以你应该用你使用的编码明确指定(例如用replace, and the addition of quotes should apply just to strings. So your functions never do what the name imply "
(添加参数,例如open
)[在windows中它实际上是强制性的,但最好是明确的而不是依赖于其他的隐式约定操作系统)]
对于encoding='utf-8'
事情更复杂,因为不应该选择编码,但终端/控制台应该为程序提供控制台支持的编码(并且可以打印)。因此,在这种情况下,一些字符将被转义是不可避免的(终端不支持完整的Unicode)。您可能想要更改控制台的设置。