从库中任意“字符串”给出我无法控制,我想确保“字符串”是unicode类型并以utf-8编码。我想知道这是否是最好的方法:
import types
input = <some value from a lib I dont have control over>
if isinstance(input, types.StringType):
input = input.decode("utf-8")
elif isinstance(input, types.UnicodeType):
input = input.encode("utf-8").decode("utf-8")
在我的实际代码中,我将其包装在try / except中并处理错误,但我将该部分删除了。
答案 0 :(得分:5)
Unicode对象未编码(它在内部,但作为Python用户,这应该是透明的)。行input.encode("utf-8").decode("utf-8")
没有多大意义:您在开头的末尾获得完全相同的Unicode字符序列。
if isinstance(input, str):
input = input.decode('utf-8')
是确保将str对象(字节字符串)转换为Unicode字符串所需的全部内容。
答案 1 :(得分:2)
只需;
try:
input = unicode(input.encode('utf-8'))
except ValueError:
pass
寻求宽恕总比获得许可更好。
答案 2 :(得分:2)
我认为你对Unicode和编码有误解。 Unicode字符只是数字。编码是数字的表示。将Unicode字符视为15个概念,编码为15,1111,F,XV。在解码编码并“知道”Unicode值之前,您必须知道编码(十进制,二进制,十六进制,罗马数字)。
如果您无法控制输入字符串,则很难将其转换为任何字符串。例如,如果输入是从文件中读取的,那么您必须知道文本文件的编码为decode
它有意义地为Unicode,然后encode
为您的'UTF-8' C ++库。
答案 3 :(得分:0)
您确定要以Unicode类型存储UTF-8编码序列吗?通常,Python使用UCS-2或-4存储types.UnicodeType中的字符,有时也称为“宽”字符,它应该能够包含来自所有相当常见的脚本的字符。
有人想知道这是什么类型的lib,有时输出types.StringType,有时是types.UnicodeType。如果我会猜测,lib总是生成type.StringType,但不会告诉它在哪个编码。如果是这种情况,你实际上是在寻找可以猜出charset是什么类型的代码.StringType是编码的如
在大多数情况下,这很容易,因为你可以认为它是在例如拉丁-1或UTF-8。如果文本实际上可以是任何奇数编码(例如,没有适当标题的传入邮件),则需要一个猜测编码的库。请参阅http://chardet.feedparser.org/。