我正在将utf-8中的文件读入unicode,我没有收到任何错误。
try:
f = codecs.open(fil_name, "r","utf-8")
f_str = f.read()
也就是说,字符串f_str在“unicode”中 在程序的后面,我必须将f_str中的(u)字符串发送到套接字。我正在尝试将字符串转换回“utf-8”。
usock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
usock.connect(("xxx server", 123))
usock.send("TEXT %s\nENDQ\n" % f_str.replace("\n", " ").encode("utf-8"))
这里我收到一条错误消息:
usock.send("TEXT %s\nENDQ\n" % text.replace("\n", " ").encode("utf-8"))
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 41: ordinal not in range(128)
在我的文字中,我的字符不能使用纯ASCII(äö..)进行编码,但utf-8或latin-1不存在问题。 为什么我收到此错误?我没有使用ASCII,我使用的是unicode / utf-8 ???
答案 0 :(得分:1)
您的字符串文字是一个字节字符串。当你试图嵌入它时,Python将隐式尝试使用默认编码(ascii)转换为字节字符串。
有几种方法可以解决这个问题。一个是使用Python 3. ;-)
如果您使用的是Python 2,请将以下内容放在源文件的顶部:
from __future__ import unicode_literals
然后你的文字也将是unicode。
你也可以在字符串前加上'u'。
该行的另一个问题是优先权。 '%s'格式操作正在尝试在右侧完成后使用ascii编解码器隐式地将您的unicode转换为字符串。
所以,试试这个:
(u"TEXT %s\nENDQ\n" % f_str.replace(u"\n", u" ")).encode("utf-8")
答案 1 :(得分:0)
首先检查明显的python unicode清单:
-*- encoding:utf-8 -*-
放在每个源文件的顶部也
如果已经是unicode,为什么需要编码('utf-8')?如果你不这样做,会得到什么错误信息?
你是否尝试将f_str显式声明为unicode:like
f_str=unicode(f_str)
也尝试打印f_str并检查你是否在之前得到了正确的结果..也许这是数据的问题
答案 2 :(得分:0)
此行发生错误
usock.send("TEXT %s\nENDQ\n" % text.replace("\n", " ").encode("utf-8"))
我可以通过这种方式重现类似的错误:
In [23]: text = 'äö'
In [24]: 'TEXT %s'%text.replace("n", " ").encode('utf-8')
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)
虽然您已经证明f_str
是unicode
,但不知何故,text
是str
个对象。您在f_str
和text
之间进行的一些额外处理可能会使text
成为str
。
如果您可以将所有输入转换为unicode,请将它们作为unicode使用,并且只在输出时转换回特定的编码(根据需要),您的问题应该得到解决。