使用iconv将latin-1文件批量转换为utf-8

Jas*_*smo 32 shell character-encoding iconv

我在我的OSX上有一个PHP项目,它是在latin1 -encoding中.现在我需要将文件转换为UTF8.我不是一个shell编码器,我尝试过从互联网上找到的东西:

mkdir new  
for a in `ls -R *`; do iconv -f iso-8859-1 -t utf-8 <"$a" >new/"$a" ; done
Run Code Online (Sandbox Code Playgroud)

但这不会创建目录结构,它会让我在运行时加载错误.任何人都可以拿出整洁的解决方案吗?

Pau*_*ce. 41

你不应该这样使用ls,for循环也不合适.此外,目标目录应位于源目录之外.

mkdir /path/to/destination
find . -type f -exec iconv -f iso-8859-1 -t utf-8 "{}" -o /path/to/destination/"{}" \;
Run Code Online (Sandbox Code Playgroud)

不需要循环.该-type f选项包括文件和排除目录.

编辑:

OS X版本iconv没有该-o选项.试试这个:

find . -type f -exec bash -c 'iconv -f iso-8859-1 -t utf-8 "{}" > /path/to/destination/"{}"' \;
Run Code Online (Sandbox Code Playgroud)

  • 如果文件存在多个子目录,则这不起作用,因为echo或`-o`路径显示"No such file or directory",因为它不会在输出位置创建父目录. (11认同)

cmc*_*nty 16

一些好的答案,但我发现在我的情况下使用数百个要转换的文件的嵌套目录更容易:

警告:这将写入文件,因此请进行备份

$ vim $(find . -type f)

# in vim, go into command mode (:)
:set nomore
:bufdo set fileencoding=utf8 | w
Run Code Online (Sandbox Code Playgroud)

  • 您无需输入vim即可执行此操作.以下命令执行相同的操作:`vim"+ set nomore""+ bufdo set fileencoding = utf8 | w""+ q"$(find.-type f)` (13认同)

UTF*_*ath 11

这将转换所有具有.php文件扩展名的文件 - 在当前目录及其子目录中 - 保留目录结构:

    find . -name "*.php" -exec sh -c "iconv -f ISO-8859-1 -t UTF-8 {} > {}.utf8"  \; -exec mv "{}".utf8 "{}" \;
Run Code Online (Sandbox Code Playgroud)

笔记:

要获取预先定位的文件列表,只需运行不带-exec标志的命令(如下所示:) find . -name "*.php".做一个备份是个好主意.

使用sh这样可以使用-exec进行管道和重定向,这是必要的,因为并非所有版本的iconv都支持该-o标志.

添加.utf8到输出的文件名然后删除它可能看起来很奇怪,但它是必要的.对输出和输入文件使用相同的名称可能会导致以下问题:

  • 对于大型文件(根据我的经验,大约30 KB),它会导致核心转储(或termination by signal 7)

  • 某些版本的iconv似乎在读取输入文件之前创建输出文件,这意味着如果输入和输出文件具有相同的名称,则在读取之前输入文件将被空文件覆盖.


小智 10

要将一个完整的目录树递归地从iso-8859-1转换为utf-8,包括子目录的创建,上面没有一个简短的解决方案适合我,因为目标结构没有在目标中创建.根据Dennis Williamsons的回答,我想出了以下解决方案:

find . -type f -exec bash -c 't="/tmp/dest"; mkdir -p "$t/`dirname {}`"; iconv -f iso-8859-1 -t utf-8 "{}" > "$t/{}"' \;
Run Code Online (Sandbox Code Playgroud)

它将创建当前目录子树的克隆/tmp/dest(根据您的需要调整),包括所有子目录和iso-8859-1转换为的所有文件utf-8.在macosx上测试.

顺便说一句:检查您的文件编码:

file -I file.php
Run Code Online (Sandbox Code Playgroud)

获取编码信息.

希望这可以帮助.


Ric*_*rra 6

我创建了以下脚本:(i)备份目录"转换"中的所有tex文件,(ii)检查每个tex文件的编码,以及(iii)仅将ISO-8859-1中的tex文件转换为UTF-8编码.

FILES=*.tex
for f in $FILES
do
  filename="${f%.*}"
  echo -n "$f"
#file -I $f
  if file -I $f | grep -wq "iso-8859-1"
  then
    mkdir -p converted
    cp $f ./converted
    iconv -f ISO-8859-1 -t UTF-8 $f > "${filename}_utf8.tex"
    mv "${filename}_utf8.tex" $f
    echo ": CONVERTED TO UTF-8."
  else
    echo ": UTF-8 ALREADY."
  fi
done
Run Code Online (Sandbox Code Playgroud)


Alb*_*gni 5

如果您要转换的所有文件都是.php,则可以使用以下命令,默认情况下它是递归的:

for a in $(find . -name "*.php"); do iconv -f iso-8859-1 -t utf-8 <"$a" >new/"$a" ; done
Run Code Online (Sandbox Code Playgroud)

我认为您的错误是由于以下事实导致的,该结果ls -R还会产生iconv无法识别为有效文件名的输出,例如./my/dir/structure:


小智 5

在 unix.stackexchange.com 上有人问了一个类似的问题,用户 manatwork 建议重新编码,这很好地解决了这个问题。

我一直在使用它来将 ucs-2 转换为 utf-8

recode ucs-2..utf-8 *.txt
Run Code Online (Sandbox Code Playgroud)