我在我的一个脚本中测试chardet。我想确定结果变量的编码类型,chardet似乎在这里做得很好。
所以这就是我在做的事情:
myvar1< - 从其他函数中获取其值
myvar2 = chardet.detect(myvar1)< - 来检测 myvar1的编码类型
现在,当我执行打印myvar2 时,我会收到输出:
{'置信':1.0,'编码': 'ASCII'}
问题1:有人可以指出如何仅收集编码值部分,即ascii。
修改 方案如下:
我使用unicode(myvar1)将所有输入写为unicode。但是只要myvar1获得类似0xab的值,unicode(myvar1)就会失败并显示错误:
UnicodeDecodeError:'ascii'编解码器 无法解码位置xxx中的字节0xab:序号不在范围(128)
中
因此,我想:
- 首先确定myvar1中输入的编码类型,
- 采用myvar2中的编码类型,
- 使用decode()[?]
使用此编码(myvar2)解码输入(myvar1)- 将其传递给unicode。
醇>
进入的输入是可变的,而不是我的控制。
我确信还有其他方法可以做到这一点,但我是新手。我很乐意尝试。
请指点。
非常感谢。
答案 0 :(得分:1)
print myvar2['encoding']
现在添加相关信息:chardet
是尝试检测编码。它不是100%可靠,有时也会失败。然而,由于无法进行可靠的编码检测,因此它是您获得的最佳选择。如果chardet
失败,请为用户提供指定编码的方法。
您无法读取您不知道特定编码类型的文本。它是 不可能 - 因为相同的字节序列可能意味着不同编码上的不同字符。换句话说,编码是模糊的。 chardet
只是猜测。它可以和在野外失败。最好也是唯一可靠的方法是询问是谁生成了首先使用编码的字符串。
修改强> 的 对于您的场景,保持理智的唯一方法是询问生成字符串的人使用的编码是什么。你说那个
“进来的输入是可变的 不在我的掌控之中。“
如果这是真的,那么你无法正确读取输入。你不能从一堆字节读取文本输入,而事先不知道它使用了哪种编码。不可能。根据定义。
请询问生成字节串的人是否为您提供用于生成字节串的编码以及字节串本身,以便您了解它们。 没有编码,字节字符串只是一块字节,你不知道哪些字符存在。这就像拥有大量数据但不知道如何解释它们。
这些字节来自哪里?为什么不控制使用哪种编码生成数据?数据提供商是否知道他们提供的数据无用,因为您无法正确解释它?
我将再次重复以明确说明:不能正确,可靠地读取一堆字节作为文本而不知道用于生成字节的编码。它无法可靠地运作。你需要与制作人达成某种协议,这样你才能知道编码。
答案 1 :(得分:0)
第二个问题:正如追溯所说,aBuf
是一个int
,但它期待一个字符串。你需要找出原因。
0xab
)而不是字符串('\xab'
)。在任何情况下,chardet都需要超过1个字节才能猜测编码。给任何字符集检测器喂一个字节是完全没有意义的。