我在测试chardet的一个脚本。我想确定结果变量的编码类型,chardet在这里似乎做得很好。在
所以这就是我要做的:
myvar1 <-- gets its value from other functions
myvar2 = chardet.detect(myvar1) <-- to detect the encoding type of myvar1
现在,当我执行打印myvar2时,我会收到输出:
{'confidence': 1.0, 'encoding': 'ascii'}
问题1:有人能给出一个指针,说明如何从中只收集编码值部分,即ascii。在
编辑: 场景如下:
我使用unicode(myvar1)将所有输入都写成unicode。但是一旦myvar1获得一个像0xab这样的值,unicode(myvar1)就会失败,并出现错误:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xab in position xxx: ordinal not in range(128)
因此,我想:
- first identify the encoding type of the input which comes in myvar1,
- take the encoding type in myvar2,
- decode the input (myvar1) with this encoding (myvar2) using decode() [?]
- pass it on to unicode.
输入是可变的,不受我的控制。在
我相信还有其他方法可以做到这一点,但我对这一点还不熟悉。我愿意尝试。在
有指针吗。在
非常感谢。在
第二个问题:正如回溯所说,
aBuf
是一个int
,但它需要一个字符串。你得找出原因。在啊哈。。。只需计算出它;输入的是一个字节,用整数(
0xab
)表示,而不是字符串('\xab'
)。在任何情况下,chardet需要远远超过1个字节才能猜测编码。给任何字符集检测器输入一个字节是完全没有意义的。在现在对于添加的相关信息:
chardet
是检测编码的尝试。它不是100%可靠,有时会失败。不过,这是最好的,因为可靠的编码检测是不可能的。如果chardet
失败,只需为用户提供一种指定编码的方法。在你不能阅读你不知道特定编码类型的文本。这是不可能的,因为相同的字节序列可能意味着不同编码的不同字符。换句话说,编码是不明确的。
chardet
只是猜测。它可以而且在野外也会失败。最好也是唯一可靠的方法是询问生成字符串的人首先使用了哪种编码。在编辑: 对于您的场景,保持理智的唯一方法是询问生成字符串的人使用了什么编码。你这么说的
如果这是真的,那么您就无法正确读取输入。如果事先不知道文本输入使用的是哪种编码,就无法从一堆字节中读取文本输入。这是不可能的。根据定义。在
请询问生成bytestrings的人向您提供用于生成bytestrings的编码,以及bytestrings本身,这样您就可以理解它们了。如果没有编码,bytestring只不过是一块字节,您无法知道其中有哪些字符。就像拥有一堆数据却不知道如何解释它们。在
字节是从哪里来的?为什么你不能控制用来生成数据的编码?数据提供者是否知道他们提供的数据由于您无法正确解释而变得无用?在
我再重复一遍,让大家明白:你不可能在不知道生成字节的编码的情况下,正确、可靠地将一堆字节作为文本读取。它不可能可靠地工作。你需要和制作人达成某种协议,这样你就能知道编码了。在
相关问题 更多 >
编程相关推荐