在字符集之间转换文本文件的最佳方法?


526

在字符集之间转换文本文件的最快,最简单的工具或方法是什么?

具体来说,我需要从UTF-8转换为ISO-8859-15,反之亦然。

一切顺利:以您喜欢的脚本语言,命令行工具或其他适用于OS,网站等的实用工具进行一线处理

迄今为止最好的解决方案:

在Linux / UNIX / OS X / cygwin上:

  • Troels Arvin建议的Gnu iconv最好用作过滤器。它似乎是普遍可用的。例:

    $ iconv -f UTF-8 -t ISO-8859-15 in.txt > out.txt
    

    正如Ben指出的,有一个使用iconv在线转换器

  • Cheekysoft建议的Gnu recode手册)将就地转换一个或几个文件。例:

    $ recode UTF8..ISO-8859-15 in.txt
    

    这使用较短的别名:

    $ recode utf8..l9 in.txt
    

    重新编码还支持可用于在不同的行尾类型和编码之间进行转换的表面

    将换行符从LF(Unix)转换为CR-LF(DOS):

    $ recode ../CR-LF in.txt
    

    Base64编码文件:

    $ recode ../Base64 in.txt
    

    您也可以将它们结合在一起。

    将具有Unix行结尾的Base64编码的UTF8文件转换为具有Dos行结尾的Base64编码的Latin 1文件:

    $ recode utf8/Base64..l1/CR-LF/Base64 file.txt
    

在带有Powershell的 Windows (Jay Bazuzi)上:

  • PS C:\> gc -en utf8 in.txt | Out-File -en ascii out.txt

    (尽管没有ISO-8859-15支持;它说支持的字符集是unicode,utf7,utf8,utf32,ascii,bigendianunicode,default和oem。)

编辑

您是说iso-8859-1支持吗?使用“字符串”可以做到这一点,反之亦然

gc -en string in.txt | Out-File -en utf8 out.txt

注意:可能的枚举值为“未知,字符串,Unicode,字节,BigEndianUnicode,UTF8,UTF7,Ascii”。


我试过了,gc -en Ascii readme.html | Out-File -en UTF8 readme.html但是它将文件转换为utf-8,但是然后它是空的!Notepad ++说文件是Ansi格式,但据我了解它甚至不是有效的字符集,但仍在读取?uk.answers.yahoo.com/question/index?qid=20100927014115AAiRExF
OZZIE 2013年

2
刚遇到这个问题,寻找相关问题的答案-很棒的摘要!只是认为值得添加,recode如果您不传递任何文件名,它也可以充当过滤器,例如:recode utf8..l9 < in.txt > out.txt
Jez

iconv.com/iconv.htm似乎对我已经死了?(超时)
Andrew Newby 2014年

2
如果使用enca,则无需指定输入编码。通常只需指定语言即可:enca -L ru -x utf8 FILE.TXT
亚历山大·波兹涅夫

1
实际上,iconv作为就地转换器而不是过滤器要好得多。使用200万行以上的文件转换iconv -f UTF-32 -t UTF-8 input.csv > output.csv仅节省了约70万行,仅节省了三分之一。使用就地版本iconv -f UTF-32 -t UTF-8 file.csv成功转换了全部200万行。
Nicolay77 '16

Answers:


246

独立实用程序方法

iconv -f ISO-8859-1 -t UTF-8 in.txt > out.txt
-f ENCODING  the encoding of the input
-t ENCODING  the encoding of the output

您不必指定这两个参数。它们将默认为您当前的语言环境,通常为UTF-8。


4
对于因不可用非破折号版本而烦恼的其他任何人,iconv的OSX(可能还有所有BSD)版本似乎不支持各种UTF- *编码的非破折号别名。 iconv -l | grep UTF会告诉您iconv副本确实支持的所有与UTF相关的编码。
coredumperror 2012年

14
不知道您输入文件的编码吗?使用chardet in.txt生成的最佳猜测。结果可以用作中的编码iconv -f ENCODING

4
防止在无效字符处退出(避免出现illegal input sequence at position消息),并用“相似”字符替换“奇怪”字符:iconv -c -f UTF-8 -t ISO-8859-1//TRANSLIT in.txt > out.txt
knb

我喜欢它,因为它在大多数NIX平台上都是标准的。但也看到了VIM命令选项(别名:ex以下。附加信息:(1)您(可能)不需要使用指定-f(from)选项iconv。(2)该file --mime-encoding <file/s>命令可以帮助您首先弄清楚编码。
fr13d

1
FWIW该file命令将我的来源报告为UTF-16 Little Endian;运行iconv -f UTF-16 -t UTF-8...将其错误地转换为ASCII,我必须明确指定iconv -f UTF-16LE...输出UTF-8
柏拉图

90

尝试VIM

如果可以的vim话,可以使用以下命令:

未针对每种编码进行测试。

与此有关的最酷的部分是,您不必知道源编码

vim +"set nobomb | set fenc=utf8 | x" filename.txt

请注意,此命令直接修改文件


说明部分!

  1. +:在打开文件时,vim用来直接输入命令。通常用于在特定行打开文件:vim +14 file.txt
  2. |:多个命令的分隔符(如;bash中的命令)
  3. set nobomb :没有utf-8 BOM
  4. set fenc=utf8:将新编码设置为utf-8 doc链接
  5. x :保存并关闭文件
  6. filename.txt :文件的路径
  7. ":由于管道的缘故,这里在这里。(否则bash会将它们用作bash管道)

很酷,但有点慢。有没有办法改变它一次转换多个文件(从而节省了vim的初始化成本)?
DomQ '16

谢谢您的解释!在开始阅读有关炸弹/炸弹设置的信息之前,我一直很难过。
jjwdesign '16

1
np,此外,如果您使用vim -b或,您可以查看物料清单head file.txt|cat -e
Boop

1
例如:find -regextype posix-extended -type f -regex ".*\.(h|cpp|rc|fx|cs|props|xaml)" -exec vim +'set nobomb | set fenc=utf8 | x' {} \;
加百利

我用它来转换CSV文件的编码,当我看到字符集确实发生了变化时,我感到非常兴奋。不幸的是,当我将文件加载到MySQL时,它的列数与运行vim命令之前的列数不同。想知道是否可以仅打开文件,转换编码并保存/关闭文件,而其他所有文件内容都相同吗?
NightOwlPrgmr

39

在Linux下,您可以使用功能非常强大的recode命令尝试在不同的字符集以及任何行尾问题之间进行转换。recode -l将向您显示该工具可以转换的所有格式和编码。这很可能会很长。


您如何转换为LF?有/CR/CR-LF,但没有/LF
阿伦弗兰卡


20
Get-Content -Encoding UTF8 FILE-UTF8.TXT | Out-File -Encoding UTF7 FILE-UTF7.TXT

最短的版本,如果可以假设输入的BOM是正确的:

gc FILE.TXT | Out-File -en utf7 file-utf7.txt

1
这是一个较短的版本,效果更好。gc .\file-utf8.txt | sc -en utf7 .\file-utf7.txt
拉里·

@LarryBattle:Set-ContentOut-File什么更好?
杰·巴祖兹

...哦。我猜他们几乎是同一回事。我在运行您的示例时遇到了麻烦,因为我假设两个版本都使用相同的file-utf8.txt文件进行输入,因为它们的输出文件都与相同file-utf7.txt
拉里·

除非不支持UTF16,否则这将是非常不错的。它支持UTF32,但不支持UTF16!除了许多Microsoft软件(例如SQL Server bcp)坚持使用UTF16之外,我不需要转换文件,然后它们的实用程序就不会转换为文件。至少可以说有趣。
挪亚

我试过了,gc -en Ascii readme.html | Out-File -en UTF8 readme.html但是它将文件转换为utf-8,但是然后它是空的!Notepad ++说文件是Ansi格式,但据我了解它甚至不是有效的字符集,但仍在读取?uk.answers.yahoo.com/question/index?qid=20100927014115AAiRExF
OZZIE 2013年

16

尝试iconv Bash功能

我把它放进去了.bashrc

utf8()
{
    iconv -f ISO-8859-1 -t UTF-8 $1 > $1.tmp
    rm $1
    mv $1.tmp $1
}

..以便能够像这样转换文件:

utf8 MyClass.java

8
最好使用tmp = $(mktmp)创建一个临时文件。同样,带有rm的行是多余的。
LMZ 2015年

1
您可以通过自动检测输入格式来完成此功能吗?
mlibre

3
请注意,此函数将删除输入文件,而不验证iconv调用是否成功。
philwalk

这将更改文本文件的内容。我在带有BOM的UTF-8上运行此程序,希望能得到不带BOM文件的UTF-8,但是它位于文件开头。
亚伦·弗兰克


13

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

从而file -bi表示:

  • -b--brief 不要在输出行前添加文件名(简短模式)。

  • -i--mime 使file命令输出mime类型的字符串,而不是更传统的人类可读字符串。因此它可以说text/plain; charset=us-ascii而不是ASCII text。该sed命令仅将其切us-asciiiconv

find命令对于这种文件管理自动化非常有用。点击查看更多find嘉豪


3
我必须对此解决方案进行一些调整,才能在Mac OS X上运行,至少在我的版本中是如此。find . -type f -iname *.txt -exec sh -c 'iconv -f $(file -b --mime-encoding "$1" | awk "{print toupper(\$0)}") -t UTF-8 > converted "$1" && mv converted "$1"' -- {} \;
布赖恩·米勒

1
您的代码也可以在带有MinGW-w64(最新版本)的Windows 7上使用。感谢分享!
silvioprog

@rmuller该sed命令是有目的的,可以自动检测字符编码。我扩大了答案,现在对此进行解释。就读者而言,删除任何剩余无关的评论将是礼貌的。谢谢。
Serge Stroobandt

@SergeStroobandt也许我还不够清楚。我的观点是,当您使用“ file -b --mime-encoding”而不是“ file -bi”时,无需使用sed过滤结果。该命令仅返回文件编码。因此,在您的示例“ us-ascii”中
rmuller

在Linux上,这实际上对我没有任何帮助。我将文件另存为带BOM的UTF-8,并期望将其转换为不带BOM的UTF-8,但事实并非如此。
亚伦·弗兰克

3

PHP iconv()

iconv("UTF-8", "ISO-8859-15", $input);


1
该语句在转换字符串时非常有用,但不适用于文件。
jjwdesign

2

DOS / Windows:使用代码页

chcp 65001>NUL
type ascii.txt > unicode.txt

命令chcp可用于更改代码页。代码页65001是UTF-8的Microsoft名称。设置代码页后,以下命令生成的输出将被设置为代码页。


1

编写属性文件(Java)通常我在Linux中使用它(mint和ubuntu发行版):

$ native2ascii filename.properties

例如:

$ cat test.properties 
first=Execução número um
second=Execução número dois

$ native2ascii test.properties 
first=Execu\u00e7\u00e3o n\u00famero um
second=Execu\u00e7\u00e3o n\u00famero dois

PS:我在葡萄牙语中写了执行编号一/二来强制使用特殊字符。

就我而言,在第一次执行时,我收到以下消息:

$ native2ascii teste.txt 
The program 'native2ascii' can be found in the following packages:
 * gcj-5-jdk
 * openjdk-8-jdk-headless
 * gcj-4.8-jdk
 * gcj-4.9-jdk
Try: sudo apt install <selected package>

当我安装第一个选件(gcj-5-jdk)时,问题就解决了。

我希望这可以帮助某人。




0

我最喜欢的工具是Jedit(基于Java的文本编辑器),它具有两个非常方便的功能:

  • 一种使用户可以使用不同的编码重新加载文本的方法(因此可以直观地控制结果)
  • 另一个允许用户在保存之前明确选择编码(和行尾)的编码

0

只需在状态栏右侧(底部)指示当前字符集的IntelliJ IDEA IDE中更改已加载文件的编码。它提示重新加载或转换,请使用转换。请确保您事先备份了原始文件。


0

如果使用macOS GUI应用程序是麻烦的事,SubEthaEdit是我通常用于编码处理的文本编辑器-其“转换预览”可让您查看输出编码中的所有无效字符,并修复/删除它们。

而且它现在是开源的,所以对他们来说是😉。


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.