【问题标题】:Splitting results from chardet output to collect encoding type从 chardet 输出拆分结果以收集编码类型
【发布时间】:2010-10-25 12:53:40
【问题描述】:

我正在我的一个脚本中测试 chardet。我想确定结果变量的编码类型,而 chardet 似乎在这里做得很好。

这就是我正在做的:

myvar1

myvar2 = chardet.detect(myvar1)

现在,当我执行 print myvar2 时,我会收到输出:

{'置信度': 1.0, '编码': 'ascii'}

问题1:谁能指点一下如何只收集其中的编码值部分,即ascii。

编辑: 场景如下:

我正在使用 unicode(myvar1) 将所有输入写为 unicode。但是,一旦 myvar1 获得像 0xab 这样的值,unicode(myvar1) 就会失败并出现错误:

UnicodeDecodeError: 'ascii' 编解码器 无法解码位置 xxx 中的字节 0xab:序数不在范围内(128)

因此,我想:

  1. 首先确定myvar1中输入的编码类型,
  2. 取myvar2中的编码类型,
  3. 使用 decode() [?] 使用此编码 (myvar2) 解码输入 (myvar1)
  4. 将其传递给 unicode。

输入是可变的,不受我控制。

我确信还有其他方法可以做到这一点,但我对此并不陌生。我愿意尝试。

请指点。

非常感谢。

【问题讨论】:

    标签: python


    【解决方案1】:
    print myvar2['encoding']
    

    现在添加相关信息:chardet 是检测编码的尝试。它不是 100% 可靠的,有时会失败。然而,这是你所拥有的最好的,因为可靠的编码检测是不可能的。如果chardet 对他们来说失败,只需为您的用户提供一种指定编码的方法。

    您无法阅读不知道特定编码类型的文本。这是不可能——因为相同的字节序列在不同的编码中可能意味着不同的字符。换句话说,编码是模棱两可的。 chardet 只是一个猜测。它可以而且会在野外失败。最好也是唯一可靠的方法是询问生成字符串的人首先使用了哪种编码。


    编辑: 对于您的情况,保持理智的唯一方法是询问生成字符串的人使用的编码是什么。你说的

    "进来的输入是可变的,并且 不在我的控制范围内。”

    如果这是真的,那么无法正确读取输入。您不能在事先不知道它使用哪种编码的情况下从一堆字节中读取文本输入。不可能。根据定义。

    请询问生成字节串的人,以向您提供用于生成字节串的编码,以及字节串本身,以便您理解它们。 如果没有编码,字节串只是一大块字节,你无法知道那里有哪些字符。这就像拥有一堆数据但不知道如何解释它们。

    这些字节是从哪里来的?为什么您无法控制用于生成数据的编码?数据提供者是否知道他们提供的数据是无用,因为您无法正确解释它?

    我将再重复一次以明确表示:您无法正确、可靠地将一堆字节作为文本读取,而不知道用于生成字节的编码。它不可能可靠地工作。您需要与制作人达成某种协议,这样您才能知道编码。

    【讨论】:

    • 谢谢。但是进入 myvar1 的输入是可变的。我不知道 myvar1 中每个值的具体编码类型。目前,我正在使用 unicode(myvar1) 但我发现它在某些类型上失败。因此,寻找chardet自动检测方案。
    • @sunshine:您无法阅读不知道特定编码类型的文本。这是不可能——因为相同的字节序列在不同的编码中可能意味着不同的字符。换句话说,编码是模棱两可的。 chardet 只是一个猜测。它可以而且将会在野外失败。最好且唯一可靠的方法是询问生成字符串的人首先使用了哪种编码。
    • 好的。你能看看我上面问题中的场景并分享你的想法吗?
    • 我明白了。我检查了最后的文件。有 2 种文件类型 - 1 种纯文本和 2 种 xml。我做了一个 cat -v file > newfile 然后在脚本中使用了这个文件。脚本仍然因相同的错误而中断。
    • 我阅读了使用 BOM 解决类似问题的内容。对此有任何想法吗?我正在考虑添加 if { myvar1 = '0xab' then decode(myvar1, ('UTF-8')) action 1 else action 2 }... 你觉得呢。
    【解决方案2】:

    第二个问题:正如回溯所说,aBuf 是一个int,但它需要一个字符串。你需要找出原因。

    uhhhh ...刚刚解决了;你给它一个字节,表示为整数 (0xab) 而不是字符串 ('\xab')。无论如何,chardet 需要超过 1 个字节才能猜出编码。为任何字符集检测器提供一个字节是完全没有意义的。

    【讨论】:

    • 0xab 是 171。len(aBuf) 正在尝试获取数字的长度。所以失败..?那这不是 chardet 的错误吗?
    • :) 那么如何识别单字节输入的编码类型呢?
    • 使用 unicode(myvar1) 时,提示 UnicodeDecodeError: 'ascii' codec can't decode byte 0xab in position xxx 失败
    • 你不能。每个字节都有多种可能性。为什么你认为需要识别单个字节的编码???
    • 喂 chardet 整个“myvar1”,而不是 unicode() 失败的单个字节!! [结束了,我的 TZ 已经过了午夜]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-26
    • 1970-01-01
    相关资源
    最近更新 更多