我正在尝试将一堆文件从US-ASCII转码为UTF-8。
为此,我正在使用iconv:
iconv -f US-ASCII -t UTF-8 file.php > file-utf8.php
我的原始文件是US-ASCII编码,这使得转换不会发生。显然它会发生因为ASCII是UTF-8的一个子集......
引用:
在非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
答案 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-ascii
。 iconv -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)
namespace
和Mathieu'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
-es
在 ex
和 script
模式下运行 vim,因此不会渲染任何内容。然后它执行设置文件编码的命令(vim 负责细节),然后关闭文件 '+wq!'。
我对这个问题迟到了,但之前使用 iconv
的答案根本没有完成这项工作,并且即使在添加 -c
以删除这些字符时,也使文件处于非 utf-8 字符的状态。