【问题标题】:How can I be sure of the file encoding?如何确定文件编码?
【发布时间】:2012-06-16 15:39:00
【问题描述】:

我有一个用 VIM 创建的 PHP 文件,但我不确定它的编码方式。

当我使用终端并使用命令file -bi foo(我的操作系统是 Ubuntu 11.04)检查编码时,它会给出下一个结果:

text/html; charset=us-ascii

但是,当我用 gedit 打开文件时,它说它的编码是 UTF-8。

哪一个是正确的?我希望文件以 UTF-8 编码。

我的猜测是文件中没有 BOM,并且命令 file -bi 读取文件并没有找到任何 UTF-8 字符,所以它假定它是 ascii,但实际上它是用 UTF-8 编码的.

【问题讨论】:

  • 您的文件中有哪些非 ASCII 字符?
  • 有一个很好的解决方案可以使用askubuntu.com/a/681803中描述的Microsoft Visual Studio代码

标签: utf-8 character-encoding file-encodings


【解决方案1】:

嗯,首先,请注意 ASCII 是 UTF-8 的子集,因此如果您的文件仅包含 ASCII 字符,则正确地说它是用 ASCII 编码的 正确地说它是用 UTF-8 编码的。

话虽如此,file 通常只检查文件开头的一小段以确定其类型,因此如果有非 ASCII 字符但它们超出初始段,它可能会将其声明为 us-ascii的文件。另一方面,gedit 可能会说文件是 UTF-8,即使它是 ASCII,因为 UTF-8 是 gedit 的首选字符编码,并且如果您在期间添加任何非 ASCII 字符,它打算使用 UTF-8 保存文件您的编辑会话。同样,如果这就是 gedit 所说的,那就没有错。

现在回答你的问题:

  1. 运行这个命令:

    tr -d \\000-\\177 < your-file | wc -c
    

    如果输出显示“0”,则文件仅包含 ASCII 字符。它是 ASCII 格式(它也是有效的 UTF-8) 故事结束。

  2. 运行此命令

    iconv -f utf-8 -t ucs-4 < your-file >/dev/null
    

    如果您收到错误,则该文件不包含有效的 UTF-8(或至少部分已损坏)。

    如果您没有收到错误,则该文件极有可能是 UTF-8。这是因为 UTF-8 的特性使得很难将任何其他常用字符编码中的典型文本误认为是有效的 UTF-8。

【讨论】:

  • 第一个命令返回0,第二个命令没有返回错误,可以说是UTF-8。谢谢!
  • 它给了我 1120 ,这是什么意思?
  • 什么给你1120? wc?如果是这样,那么我猜你的文件中有 1120 个非 ASCII 字节。
  • 使用tr -d 是一个非常好的解决方案,因为它允许识别EBCDIC 以及使用tr -d \\100-\\377filechardet 都不能正确执行 EBCDIC!
【解决方案2】:
$ file --mime my.txt 
my.txt: text/plain; charset=iso-8859-1

【讨论】:

  • 我发现重要的是要注意,就像@Celada 已经提到的那样,file 不能授予它的检测是 100% 正确的。
【解决方案3】:

(在 Linux 上)

$ chardet <filename>

它还提供输出的置信度 [0-1]。

【讨论】:

    【解决方案4】:

    基于@Celada 的回答和@Arthur Zennig,我创建了这个简单的脚本:

    #/bin/bash
    
    if [ "$#" -lt 1 ]
    then
      echo "Usage: utf8-check filename"
      exit 1
    fi
    
    chardet $1
    countchars="$(tr -d \\000-\\177 < $1 | wc -c)"
    if [ $countchars -eq 0 ]
    then
     echo "Ascii";
     exit 0
    fi
    
    {
      iconv -f utf-8 -t ucs-4 < $1 >/dev/null
      echo "UTF-8"
    } || {
      echo "not UTF-8 or corrupted"
    }
    

    【讨论】:

      猜你喜欢
      • 2019-07-05
      • 2011-05-14
      • 1970-01-01
      • 2011-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-30
      相关资源
      最近更新 更多