这是确保python unicode;“字符串”;是用utf-8编码的吗?

这是确保python unicode;“字符串”;是用utf-8编码的吗?,python,unicode,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.Uni

给定一个我无法控制的库中的任意“字符串”,我想确保“字符串”是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")
导入类型
输入=
如果isinstance(输入,类型.StringType):
输入=输入。解码(“utf-8”)
elif isinstance(输入,类型.UnicodeType):
输入=输入。编码(“utf-8”)。解码(“utf-8”)

在我的实际代码中,我用try/except将其包装并处理错误,但我忽略了这一部分。

Unicode对象没有编码(它是内部的,但对Python用户来说应该是透明的)。行
input.encode(“utf-8”).decode(“utf-8”)
没有多大意义:您在末尾得到的Unicode字符序列与开始时完全相同

if isinstance(input, str):
    input = input.decode('utf-8')
只需确保str对象(字节字符串)转换为Unicode字符串即可

try:
    input = unicode(input.encode('utf-8'))
except ValueError:
    pass

寻求原谅总比请求许可好。

你确定要以Unicode类型存储UTF-8编码的序列吗?通常,Python使用UCS-2或-4将字符存储在types.UnicodeType中,这有时被称为“宽”字符,它应该能够包含所有常见脚本中的字符

有人想知道这是什么样的库,有时输出types.StringType,有时输出types.UnicodeType。如果我随便猜一猜,lib总是生成type.StringType,但不知道它使用的是哪种编码。如果是这样的话,您实际上是在寻找可以猜测type.StringType编码为什么字符集的代码


在大多数情况下,这很容易,因为您可以假设它是拉丁语-1或UTF-8。如果文本实际上可以采用任何奇数编码(例如,没有正确标题的传入邮件),则需要一个猜测编码的库。请参阅。

我认为您对Unicode和编码有误解。Unicode字符只是数字。编码是数字的表示形式。可以将Unicode字符视为一个类似15的概念,将编码视为15、1111、F、XV。在解码编码和“知道”Unicode值之前,必须知道编码(十进制、二进制、十六进制、罗马数字)


如果无法控制输入字符串,则很难将其转换为任何内容。例如,如果从文件读取输入,则必须知道文本文件的编码为<代码>解码> /> >,这对Unicode有意义,然后<代码>将< /CODE> >编码为'UTF-8 ',用于C++ C++库。< /P>我将这个字符串传递给另一个LIB,它是一个需要UTF-8编码的Unicode字符串的C++ LIB。是否可以确保Unicode类型的编码是UTF-8?C++库是否需要与Python的Unicode类型的内部编码进行交互?这是值得怀疑的,我不认为您可以简单地将内部编码更改为UTF-8。另一方面,您可以得到一个用UTF-8编码的Python str对象:my_unicode_string.encode('UTF-8')。太棒了!10个小时后我找到了你的答案。