批量转换文件以进行编码


Answers:


36

CygwinGnuWin32提供Unix工具,如iconvdos2unix(和unix2dos)。在Unix / Linux / Cygwin下,您将希望使用“ windows-1252”作为编码而不是ANSI(请参见下文)。(除非您知道系统使用默认代码页不是1252的代码页,否则您需要告诉iconv正确的代码页进行翻译。)

使用以下方法从一个(-f)转换为另一个(-t):

$ iconv -f windows-1252 -t utf-8 infile > outfile

或采用“一劳永逸”的形式:

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

或者:

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

在此站点上已多次问过此问题,因此这里有一些有关“ 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标准中为控制代码保留的范围时,Windows代码页1252和原始基于ISO 8859-x系列的后续Windows代码页与ISO有所不同。迄今为止,在Microsoft内部和外部都有开发社区将8859-1代码页与Windows 1252混淆,并看到用于表示Windows代码页支持的“ ANSI”或“ A”并不少见。 。


4
不要使用与输入和输出相同的文件名!iconv如果超出此大小,似乎会将文件截断为32,768字节。当他在尝试读取的文件中写入内容时,如果文件足够小,他会设法完成工作,否则他会在没有任何警告的情况下将其截断……
Niavlys 2014年

1
仅供参考,这个问题用osx标记,看起来所有的convert-all命令都不能在优胜美地或El Cap上使用。Apples发行的iconv版本不支持--verbose或-o,并且由于某种原因,其他语法重定向stdout无效,而仅将其发送到常规stdout。
斯科特·麦金太尔

28

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

%  get-content IN.txt | out-file -encoding ENC -filepath OUT.txt

而ENC类似于unicode,ascii,utf8,utf32。签出“帮助文件”。

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

% foreach($i in ls -name DIR/*.txt) { \
       get-content DIR/$i | \
       out-file -encoding utf8 -filepath DIR2/$i \
  }

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

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

% foreach($i in ls -recurse -filter "*.java") {
    $temp = get-content $i.fullname
    out-file -filepath $i.fullname -inputobject $temp -encoding utf8 -force
}

通过您的第一个提案从ANSI转换为UTF确实会擦除我的文本文件的全部内容...
Acroneos,2015年

@Acroneos:然后您犯了一个错误:输入文件是IN.txt,输出文件是OUT.txt ...这样就无法覆盖原始文件。如果您为IN.txt和OUT.txt使用相同的文件名,那么显然您将覆盖正在读取的文件。
akira 2015年

Powershell将使用BOM转换为UTF。查找和iconv可能会容易得多。
pparas

6

换行符上的Wikipedia页面上有一个有关转换实用程序的部分。

对于仅使用Windows随附的工具进行的转换,这似乎是最好的选择:

TYPE unix_file | FIND "" /V > dos_file

3

UTFCast是Windows的Unicode转换器,支持批处理模式。我使用的是付费版本,对此非常满意。

UTFCast是一个Unicode转换器,您可以通过单击鼠标将所有文本文件批量转换为UTF编码。您可以使用它将充满文本文件的目录转换为包括UTF-8,UTF-16和UTF-32在内的UTF编码到输出目录,同时保持原始文件的目录结构。您的文本文件是否具有不同的扩展名都没有关系,UTFCast可以自动检测文本文件并将其转换。


似乎它们无法转换为同一文件夹,而只能转换为另一个目标文件夹。
Uwe Keim

专业版允许就地转换。$ 20/3个月。rotatingscrew.com/utfcast-version-comparison.aspx
SherylHohman

哦,快递(免费)版本没有用-它只能“检测”带有BOM的utf-8!(每个人都可以做到)。只有Pro版本会自动检测,该版本每3个月自动续订,每次收取20美元。对于非企业用户而言,价格过高。AND请注意,如果您尝试使用基本版本,并且文件已经是utf-8(没有BOM),那么此转换器会将其检测为ASCII,然后(重新)“转换”为utf-8,这可能会导致乱码。尝试快速版本之前,请注意这一点!他们为专业人士提供了一个演示版本,该演示版本不产生任何输出-毫无意义的恕我直言,cuz无法在购买前验证结果!
SherylHohman

3

Oneliner使用查找,具有自动检测

自动检测所有匹配文本文件的字符编码,并将所有匹配文本文件转换为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"' -- {} \;

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

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

点击查看更多find嘉豪






0

在我的用例中,我需要自动检测输入编码,并且有很多带有Windows-1250编码的文件,对于它们,命令file -bi <FILE>返回charset=unknown-8bit。这是的无效参数iconv

我在enca取得了最好的成绩。

将所有带有txt扩展名的文件转换为utf-8

find . -type f -iname *.txt -exec sh -c 'echo "$1" && enca "$1" -x utf-8' -- {} \;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.