批量转换文件中的编码

des*_*lat 55 windows linux encoding batch macos

如何使用命令或工具批量转换目录中的文件以进行编码(例如 ANSI ? UTF-8)?

对于单个文件,编辑器会有所帮助,但我该如何完成批量文件工作?

qua*_*ote 42

CygwinGnuWin32提供 Unix 工具,如iconvdos2unix(和unix2dos)。在 Unix/Linux/Cygwin 下,您需要使用“windows-1252”作为编码而不是 ANSI(见下文)。(除非您知道您的系统使用 1252 以外的代码页作为其默认代码页,在这种情况下,您需要告诉iconv正确的代码页进行转换。)

从一个 ( -f) 转换为另一个 ( -t) :

$ iconv -f windows-1252 -t utf-8 infile > outfile
Run Code Online (Sandbox Code Playgroud)

或者以“一劳永逸”的形式:

## this will clobber the original files!
$ find . -name '*.txt' -exec iconv --verbose -f windows-1252 -t utf-8 {} \> {} \;
Run Code Online (Sandbox Code Playgroud)

或者:

## this will clobber the original files!
$ find . -name '*.txt' -exec iconv --verbose -f windows-1252 -t utf-8 -o {} {} \;
Run Code Online (Sandbox Code Playgroud)

这个问题在这个网站上被问过很多次,所以这里有一些关于“ANSI”的附加信息。在对相关问题的回答中,CesarB 提到

有几种在 Windows 中称为“ANSI”的编码。事实上,ANSI 用词不当。iconv 无法猜测您想要哪个。

ANSI 编码是 Windows API 中“A”函数使用的编码(“W”函数使用 UTF-16)。它对应的编码通常取决于您的 Windows 系统语言。最常见的是 CP 1252(也称为 Windows-1252)。因此,当您的编辑器说 ANSI 时,它的意思是“无论 API 函数使用什么作为默认 ANSI 编码”,这是您系统中使用的默认非 Unicode 编码(因此通常用于文本文件)。

他链接到的页面提供了有关 CP 1252 和 ISO-8859-1(另一种常用编码)起源的历史花絮(引自Microsoft PDF):

[...] 这是因为 Windows 代码页 1252 最初基于 ANSI 草案,该草案后来成为 ISO 标准 8859-1。但是,在向 ISO 标准中为控制代码保留的范围添加代码点时,最初基于 ISO 8859-x 系列的 Windows 代码页 1252 和后续 Windows 代码页偏离了 ISO。直到今天,Microsoft 内部和外部的开发社区将 8859-1 代码页与 Windows 1252 混淆,并看到用于表示 Windows 代码页支持的“ANSI”或“A”并不少见.

  • 不要使用相同的文件名作为输入和输出!如果文件超过此大小,`iconv` 似乎会将文件截断为 32,768 字节。当他写入他试图读取的文件时,如果文件足够小,他会设法完成这项工作,否则他会在没有任何警告的情况下截断文件...... (6认同)
  • 仅供参考 这个问题用 osx 标记,它看起来不像在 Yosemite 或 El Cap 上的任何一个 convert-all 命令都适用。Apples 发布的 iconv 版本不支持 --verbose 或 -o,并且重定向标准输出的其他语法由于某种原因不起作用,只是将其发送到常规标准输出。 (3认同)

aki*_*ira 35

使用PowerShell,您可以执行以下操作:

Get-Content IN.txt | Out-File -encoding ENC -filepath OUT.txt
Run Code Online (Sandbox Code Playgroud)

虽然ENC类似于unicodeasciiutf8utf32。查看“帮助文件”。

要将目录中的所有 *.txt 文件转换为 UTF-8,请执行以下操作:

foreach($i in ls -name DIR/*.txt) { \
    Get-Content DIR/$i | \
    Out-File -encoding utf8 -filepath DIR2/$i \
}
Run Code Online (Sandbox Code Playgroud)

它在 DIR2 中创建每个 .txt 文件的转换版本。

要替换所有子目录中的文件,请使用:

foreach($i in ls -recurse -filter "*.java") {
    $temp = Get-Content $i.fullname
    Out-File -filepath $i.fullname -inputobject $temp -encoding utf8 -force
}
Run Code Online (Sandbox Code Playgroud)


小智 5

换行符的维基百科页面有一个关于转换实用程序的部分。

这似乎是仅使用 Windows 附带的工具进行转换的最佳选择:

TYPE unix_file | FIND "" /V > dos_file
Run Code Online (Sandbox Code Playgroud)


Ser*_*ndt 5

Oneliner 使用 find,自动检测

自动检测所有匹配文本文件的字符编码,并将所有匹配文本文件转换为 UTF-8 编码:

$ find . -type f -iname *.txt -exec sh -c 'iconv -f $(file -bi "$1" |sed -e "s/.*[ ]charset=//") -t utf-8 -o converted "$1" && mv converted "$1"' -- {} \;
Run Code Online (Sandbox Code Playgroud)

要执行这些步骤,子壳sh使用具有-exec,运行一衬垫与所述-c标志,并且使文件名作为位置参数"$1"-- {}。在两者之间,UTF-8 输出文件临时命名为converted.

find命令对于此类文件管理自动化非常有用。

点击查看更多find嘉豪

  • 这适用于 Mac:`find . -type f -iname "*.txt" -exec sh -c 'iconv -f windows-1252 -t utf-8 "$1" > 转换 && mv 转换 "$1"' -- "{}" \;`, 到从 ANSI 转换 (2认同)
  • 我的 git bash 中的 iconv 命令没有 `-o` 选项,所以我使用文件重定向 `>` : `find . -type f -name '*.txt' -exec sh -c 'iconv -f $(file -bi "$1" |sed -e "s/.*[ ]charset=//") -t utf-8 > /tmp/converted "$1" && mv /tmp/converted "$1"' -- {} \;`。与直接传递“{}”相比,使用这种语法“--”有何优势? `找到。 -type f -name '*.txt' -exec sh -c 'iconv -f $(file -bi {} |sed -e "s/.*[ ]charset=//") -t utf-8 > / tmp/converted {} && mv /tmp/converted {}' \;` (2认同)