强制编码从US-ASCII到UTF-8(iconv)

时间:2012-07-03 01:37:46

标签: utf-8 character-encoding iconv

我正在尝试将一堆文件从US-ASCII转码为UTF-8。

为此,我正在使用iconv:

iconv -f US-ASCII -t UTF-8 file.php > file-utf8.php

我的原始文件是US-ASCII编码,这使得转换不会发生。显然它会发生因为ASCII是UTF-8的一个子集......

http://www.linuxquestions.org/questions/linux-software-2/iconv-us-ascii-to-utf-8-or-iso-8859-15-a-705054/

引用:

  

在非ascii之前,不需要显示文本文件   字符介绍

真。如果我在文件中引入非ASCII字符并保存它,那么假设使用Eclipse,文件编码(字符集)将切换为UTF-8。

在我的情况下,我想强制iconv将文件转码为UTF-8 。是否包含非ASCII字符。

注意:原因是我的PHP代码(非ASCII文件...)正在处理一些非ASCII字符串,这导致字符串无法很好地解释(法语):

  

Ilétait une fois ... l'hommesé©animéemythique d'Albert

     

Barillé(Procidis),1é¨

     

...

修改

  • US-ASCII - - UTF-8的子集(请参阅下面的Ned's answer
  • 意味着US-ASCII文件 实际编码在UTF-8
  • 我的问题来自其他地方

10 个答案:

答案 0 :(得分:59)

ASCII是UTF-8的子集,因此所有ASCII文件都已经过UTF-8编码。 ASCII文件中的字节和“将其编码为UTF-8”所产生的字节将完全相同。它们之间没有区别,所以没有必要做任何事情。

看起来您的问题是文件实际上不是ASCII。您需要确定它们正在使用的编码,并对它们进行适当的转码。

答案 1 :(得分:15)

所以人们说你不能理解,当你提出问题并得到这样的答案时,你可能会感到沮丧。

如果你真的希望它以utf-8而不是us-ascii显示,那么你需要分两步完成。

首先:

iconv -f us-ascii -t utf-16 yourfile > youfileinutf16.*

第二

iconv -f utf-16le -t utf-8 yourfileinutf16 > yourfileinutf8.*

然后如果你做了一个文件-i你会看到新的字符集是utf-8。

希望它有所帮助。

答案 2 :(得分:11)

我认为Ned's got the core of the problem - 您的文件实际上不是ASCII。尝试

iconv -f ISO-8859-1 -t UTF-8 file.php > file-utf8.php

我只是猜测你实际上在使用iso-8859-1,它在大多数欧洲语言中很受欢迎。

答案 3 :(得分:2)

US-ASCII和UTF-8之间没有区别,因此无需重新转换它。 但是这里有一点提示,如果你在重新编码时遇到特殊字符问题。

在source-charset-Parameter之后添加// TRANSLIT。

示例:

iconv -f ISO-8859-1//TRANSLIT -t UTF-8 filename.sql > utf8-filename.sql

这有助于我处理奇怪类型的引号,它们总是打破了字符集重新编码过程。

答案 4 :(得分:2)

这是一个脚本,它将查找与您传递的格式匹配的所有文件,然后将其从当前文件编码转换为utf-8。如果编码是us-ascii,则它仍将显示为us-ascii,因为它是utf-8的子集。

#!/usr/bin/env bash    
find . -name "${1}" |
    while read line;
    do
        echo "***************************"
        echo "Converting ${line}"

        encoding=$(file -b --mime-encoding ${line}) 
        echo "Found Encoding: ${encoding}"

        iconv -f "${encoding}" -t "utf-8" ${line} -o ${line}.tmp
        mv ${line}.tmp ${line}
    done

答案 5 :(得分:1)

您可以使用file -i file_name来检查原始文件格式到底是什么。

一旦知道,您可以执行以下操作:

iconv -f old_format -t utf-8 input_file -o output_file

答案 6 :(得分:1)

我不小心将文件编码为UTF-7,并遇到类似问题。当我输入file -i name.file时,我会得到charset=us-asciiiconv -f us-ascii -t utf-9//translit name.file无法正常工作,因为我已经收集了UTF-7和UTF-8一样,它是us-ascii的子集。

要解决此问题,我输入了:iconv -f UTF-7 -t UTF-8//TRANSLIT name.file -o output.file

除了其他人在这里建议以外,我不确定如何确定编码。

答案 7 :(得分:0)

以下内容将转换文件夹中的所有文件。

创建原始文件的备份文件夹

mkdir backup

将所有采用US ASCII编码的文件转换为UTF-8(单行命令)

for f in $(file -i * .sql | grep us-ascii | cut -d ':' -f 1); do iconv -f us-ascii -t utf-8 $f -o $ f.utf-8 && mv $f backup / && mv "$f.utf-8" $f; done

将所有编码为ISO 8859-1的文件转换为UTF-8(单行命令)

for f $(file -i * .sql | grep iso-8859-1 | cut -d ':' -f 1); do iconv -f iso-8859-1 -t utf-8 $f -o $f.utf-8 && mv $f backup / && mv "$f.utf-8" $f; done

答案 8 :(得分:0)

namespaceMathieu's answer给了我很多启发:

我需要看到file -i myfile.htm来显示UTF-8而不是美国ASCII(是的,我知道它是UTF-8的子集)。

因此,这是一个受先前回答启发的衬纸,它将在Linux上将所有* .htm文件从美国ASCII转换为UTF-8,因此file -i将向您显示UTF-8。您可以更改* .htm(在以下命令中的两个位置)以适应您的需要。

mkdir backup 2>/dev/null; for f in $(file -i *.htm | grep -i us-ascii | cut -d ':' -f 1); do iconv -f "us-ascii" -t "utf-16" $f > $f.tmp; iconv -f "utf-16le" -t "utf-8" $f.tmp > $f.utf8; cp $fic backup/; mv $f.utf8 $f; rm $f.tmp; done; file -i *.htm

答案 9 :(得分:0)

vim -es '+set fileencoding=utf-8' '+wq!' file

-esexscript 模式下运行 vim,因此不会渲染任何内容。然后它执行设置文件编码的命令(vim 负责细节),然后关闭文件 '+wq!'。

我对这个问题迟到了,但之前使用 iconv 的答案根本没有完成这项工作,并且即使在添加 -c 以删除这些字符时,也使文件处于非 utf-8 字符的状态。