这是确保在utf-8中编码python unicode“string”的最佳方法吗?

时间:2011-03-14 21:23:07

标签: python unicode

从库中任意“字符串”给出我无法控制,我想确保“字符串”是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中并处理错误,但我将该部分删除了。

4 个答案:

答案 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/

相关问题