代码之家  ›  专栏  ›  技术社区  ›  Ian Dickinson

如何检查文件是否为有效的UTF-8?

  •  60
  • Ian Dickinson  · 技术社区  · 18 年前

    有一个 web service 在W3C,它似乎已经死了,我发现了一个仅限Windows的验证 tool 它报告无效的UTF-8文件,但不报告要修复的行/字符。

    5 回复  |  直到 7 年前
        1
  •  100
  •   Richard Gomes    7 年前

    您可以使用GNU iconv:

    $ iconv -f UTF-8 your_file -o /dev/null; echo $?
    

    $ iconv -f UTF-8 your_file > /dev/null; echo $?
    

    如果文件可以成功转换,则命令将返回0,否则返回1。此外,它将打印出发生无效字节序列的字节偏移量。

    编辑 :不必指定输出编码,它将假定为UTF-8。

        2
  •  9
  •   tzot    18 年前

    使用python和str.encode | decode函数。

    >>> a="γεια"
    >>> a
    '\xce\xb3\xce\xb5\xce\xb9\xce\xb1'
    >>> b='\xce\xb3\xce\xb5\xce\xb9\xff\xb1' # note second-to-last char changed
    >>> print b.decode("utf_8")
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/usr/local/lib/python2.5/encodings/utf_8.py", line 16, in decode
        return codecs.utf_8_decode(input, errors, True)
    UnicodeDecodeError: 'utf8' codec can't decode byte 0xff in position 6: unexpected code byte
    

    引发的异常在其.args属性中具有请求的信息。

    >>> try: print b.decode("utf_8")
    ... except UnicodeDecodeError, exc: pass
    ...
    >>> exc
    UnicodeDecodeError('utf8', '\xce\xb3\xce\xb5\xce\xb9\xff\xb1', 6, 7, 'unexpected code byte')
    >>> exc.args
    ('utf8', '\xce\xb3\xce\xb5\xce\xb9\xff\xb1', 6, 7, 'unexpected code byte')
    
        3
  •  9
  •   Roger Dahl    10 年前

    isutf8 从 moreutils 收集

    $ apt-get install moreutils
    $ isutf8 your_file
    

    --quiet 切换并检查退出状态,对于有效的utf-8文件,退出状态为零。

        4
  •  5
  •   AShelly    18 年前

    iconv

    编辑:哦,我错过了你想要脚本语言的部分。但对于命令行工作 iconv 实用程序也应该为您验证。

        5
  •  0
  •   mivk    6 年前

    你也可以使用 recode

    if recode utf8/..UCS < "$FILE" >/dev/null 2>&1; then
        echo "Valid utf8 : $FILE"
    else
        echo "NOT valid utf8: $FILE"
    fi
    

    这将尝试重新编码到 Universal Character Set (UCS) 这在有效的UTF-8中始终是可能的。

        6
  •  0
  •   Sherzad    6 年前

    #!/bin/bash
    
    inputFile="./testFile.txt"
    
    iconv -f UTF-8 "$inputFile" -o /dev/null
    
    if [[ $? -eq 0 ]]
    then
        echo "Valid UTF-8 file.";
    else
        echo "Invalid UTF-8 file!";
    fi
    

    说明:

    • --from-code , -f 编码(从编码转换字符)
    • --to-code , -t 编码(将字符转换为编码,无需指定,假定为UTF-8。)
    • --output -o 文件(指定输出文件“而不是标准输出”)
    推荐文章