将US-ASCII强制转换为UTF-8编码(iconv)

74

我想将一堆文件从US-ASCII转换成UTF-8编码。

为此,我使用iconv:

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

我的原始文件是US-ASCII编码的,这使得转换无法进行。显然这是由于ASCII是UTF-8的子集...

将US ASCII转换为UTF-8或ISO-8859-15

引用一下:

在非ASCII字符被引入之前,文本文件不需要以其他方式出现

没错。如果我在文件中引入一个非ASCII字符并保存它,比如使用Eclipse,那么文件的编码(字符集)将切换到UTF-8。

对于我的情况,我想强制iconv无论如何都将文件转换为UTF-8。无论其中是否存在非ASCII字符。

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

Il était une fois... l'homme série animée mythique d'Albert

Barillé (Procidis), 1ère

...

  • US ASCII - 就是 - UTF-8的一个子集 (见下面的Ned's答案)
  • 这意味着US ASCII文件实际上是用UTF-8编码的
  • 我的问题来自别处

你能记得你的问题来自哪里吗?我遇到了类似的问题。 - DrogoNevets
1
@DrogoNevets 不太记得了,但我认为这与在PHP中使用UTF8以及与数据库之间的转换有关...utf8_encodeutf8_decode等等...或者更深入一些: http://www.toptal.com/php/a-utf-8-primer-for-php-and-mysql https://dev59.com/13VC5IYBdhLWcg3wfhGL - eightyfive
要执行相反的操作(从UTF8转换为ASCII),请参阅如何去除重音并将字母转换为“普通”ASCII字符? - Skippy le Grand Gourou
12个回答

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

0

受到Mathieu's answerMarcelo's answer的启发:

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

因此,这里有一个灵感来自之前答案的一行代码,它将在Linux上将所有*.htm文件从US 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接