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

Best way to convert text files between character sets?

提问人: 提问时间:9/16/2008 最后编辑:17 revs, 9 users 31%Antti Kissaniemi 更新时间:5/10/2022 访问量:611382

问:

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

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

一切都在进行:您最喜欢的脚本语言的单行代码、命令行工具或其他用于操作系统、网站等的实用程序。

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

在 Linux/UNIX/OS X/cygwin 上:

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

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

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

  • Cheekysoft 建议的重新编码手动)将就地转换一个或多个文件。例:

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

    这个使用较短的别名:

      $ recode utf8..l9 in.txt
    

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

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

      $ recode ../CR-LF in.txt
    

    Base64 编码文件:

      $ recode ../Base64 in.txt
    

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

    将带有 Unix 行尾的 Base64 编码 UTF8 文件转换为带有 Dos 行尾的 Base64 编码的拉丁语 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

注意:可能的枚举值为“Unknown, String, Unicode, Byte, BigEndianUnicode, UTF8, UTF7, Ascii”。

文本 Unicode UTF-8 字符集

评论

1赞 OZZIE 9/13/2013
我试过了,但它将文件转换为 utf-8,但随后它是空的!Notepad++ 说该文件是 Ansi 格式,但据我了解,这甚至不是一个有效的字符集??uk.answers.yahoo.com/question/index?qid=20100927014115AAiRExFgc -en Ascii readme.html | Out-File -en UTF8 readme.html
2赞 Jez 3/6/2014
只是遇到这个寻找相关问题的答案 - 很棒的总结!只是认为值得添加,如果您不向它传递任何文件名,它也将充当过滤器,例如:recoderecode utf8..l9 < in.txt > out.txt
1赞 Andrew Newby 5/12/2014
iconv.com/iconv.htm 对我来说似乎已经死了?(超时)
2赞 Alexander Pozdneev 8/1/2015
如果使用 ,则无需指定输入编码。通常只需指定语言就足够了:.encaenca -L ru -x utf8 FILE.TXT
1赞 Nicolay77 5/20/2016
实际上,iconv 作为就地转换器而不是过滤器效果要好得多。转换一个超过200万行的文件,只节省了大约70万行,只有三分之一。使用就地版本成功转换了所有 200 多万行。iconv -f UTF-32 -t UTF-8 input.csv > output.csviconv -f UTF-32 -t UTF-8 file.csv

答:

24赞 Daniel Papasian 9/16/2008 #1

图标v(1)

iconv -f FROM-ENCODING -t TO-ENCODING file.txt

此外,还有许多语言的基于 iconv 的工具。

评论

2赞 Aaron Franke 3/20/2020
自动检测原始编码怎么样?
39赞 Cheekysoft 9/16/2008 #2

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

评论

1赞 Aaron Franke 3/20/2020
你如何转换 ?有,但没有LF/CR/CR-LF/LF
299赞 Troels Arvin 9/16/2008 #3

独立实用程序方法

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赞 coredumperror 5/3/2012
对于其他任何因非破折号版本不可用而绊倒的人来说,看起来 OSX(可能还有所有 BSD)版本的 iconv 不支持各种 UTF-* 编码的非破折号别名。 将告诉您 iconv 副本支持的所有与 UTF 相关的编码。iconv -l | grep UTF
23赞 Stew 9/17/2014
不知道输入文件的编码?用于生成最佳猜测。结果可以用作 中的编码。chardet in.txticonv -f ENCODING
4赞 knb 2/6/2015
防止在无效字符处退出(避免消息),并将“奇怪”字符替换为“相似”字符:.illegal input sequence at positioniconv -c -f UTF-8 -t ISO-8859-1//TRANSLIT in.txt > out.txt
1赞 Plato 12/15/2016
FWIW 命令将我的源报告为 UTF-16 Little Endian;运行错误地将其转换为 ASCII,我必须明确指定输出 UTF-8fileiconv -f UTF-16 -t UTF-8...iconv -f UTF-16LE...
1赞 Troels Arvin 6/4/2023
@jimmymcheung:根据定义,普通 7 位 ASCII 与 Unicode 完全相同。所以这是意料之中的。
24赞 Jay Bazuzi 9/16/2008 #4
Get-Content -Encoding UTF8 FILE-UTF8.TXT | Out-File -Encoding UTF7 FILE-UTF7.TXT

最短版本,如果可以假设输入物料清单正确:

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

评论

1赞 Larry Battle 7/15/2012
这是一个效果更好的较短版本。gc .\file-utf8.txt | sc -en utf7 .\file-utf7.txt
0赞 Jay Bazuzi 7/16/2012
@LarryBattle:如何比工作更好?Set-ContentOut-File
0赞 Larry Battle 7/16/2012
...哦。我想它们几乎是一回事。我在运行您的示例时遇到了问题,因为我假设两个版本都使用相同的文件进行输入,因为它们都具有相同的输出文件。file-utf8.txtfile-utf7.txt
0赞 Noah 8/22/2013
这真的很棒,只是它不支持 UTF16。它支持 UTF32,但不支持 UTF16!我不需要转换文件,除了很多Microsoft软件(例如.SQL服务器bcp)坚持使用UTF16 - 然后他们的实用程序不会转换为它。至少可以说很有趣。
0赞 OZZIE 9/13/2013
我试过了,但它将文件转换为 utf-8,但随后它是空的!Notepad++ 说该文件是 Ansi 格式,但据我了解,这甚至不是一个有效的字符集??uk.answers.yahoo.com/question/index?qid=20100927014115AAiRExFgc -en Ascii readme.html | Out-File -en UTF8 readme.html
3赞 user15096 9/17/2008 #5

PHP iconv() 中

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

评论

1赞 jjwdesign 10/3/2016
此语句在转换字符串时非常有效,但不适用于文件。
18赞 2 revs, 2 users 92%Arne Evertsson #6

尝试 iconv Bash 函数

我把它放进去:.bashrc

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

..为了能够像这样转换文件:

utf8 MyClass.java

评论

10赞 LMZ 2/27/2015
使用 tmp=$(mktmp) 创建临时文件是更好的样式。此外,带有 rm 的行是多余的。
1赞 mlibre 4/21/2016
你能用自动检测输入格式完成这个功能吗?
4赞 philwalk 12/6/2017
请注意,此函数删除输入文件,而不验证 iconv 调用是否成功。
0赞 Aaron Franke 3/20/2020
这将更改文本文件的内容。我在带有 BOM 的 UTF-8 上运行它,期望得到一个没有 BOM 文件的 UTF-8,但它在文件的开头预置了。
18赞 3 revs, 3 users 50%Jeremy Glover #7

试用记事本++

在 Windows 上,我能够使用 Notepad++ 进行从 ISO-8859-1UTF-8 的转换。单击 ,然后单击 。"Encoding""Convert to UTF-8"

110赞 4 revs, 3 users 62%Boop #8

试用 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 文档链接
  5. x:保存并关闭文件
  6. filename.txt:文件的路径
  7. ":Qotes 之所以在这里,是因为管道。(否则 bash 会将它们用作 bash 管道)

评论

1赞 DomQ 4/25/2016
很酷,但有点慢。有没有办法改变它以一次转换多个文件(从而节省 vim 的初始化成本)?
0赞 jjwdesign 10/3/2016
谢谢你的解释!在我阅读有关炸弹/无炸弹设置的信息之前,我在文件开头遇到了困难。
1赞 Boop 10/3/2016
np,此外,如果您使用 或vim -bhead file.txt|cat -e
1赞 Gabriel 4/6/2017
例如:find -regextype posix-extended -type f -regex ".*\.(h|cpp|rc|fx|cs|props|xaml)" -exec vim +'set nobomb | set fenc=utf8 | x' {} \;
0赞 NightOwlPrgmr 4/28/2017
我用它来转换 CSV 文件的编码,当我看到字符集确实发生了变化时,我真的很兴奋。不幸的是,当我将文件加载到 MySQL 中时,它的列数与运行 vim 命令之前的列数不同。想知道是否可以只打开文件、转换编码并保存/关闭文件,同时保持所有其他文件内容不变?
16赞 6 revs, 2 users 72%Serge Stroobandt #9

使用查找的 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"' -- {} \;

为了执行这些步骤,子 shell 与 一起使用,运行带有标志的单行代码,并将文件名作为位置参数传递给 。在两者之间,输出文件被临时命名为 。sh-exec-c"$1"-- {}utf-8converted

因此,文件 -bi 表示:

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

  • -i,使 file 命令输出 mime 类型的字符串,而不是更传统的人类可读字符串。因此,它可能会说例如而不是 .该命令仅根据 的要求将其剪切为 。--mimetext/plain; charset=us-asciiASCII textsedus-asciiiconv

该命令对于此类文件管理自动化非常有用。 单击此处查看更多内容find

评论

4赞 Brian J. Miller 1/21/2017
我不得不稍微调整这个解决方案才能在 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赞 silvioprog 1/7/2018
您的代码也可以在带有 MinGW-w64(最新版本)的 Windows 7 上运行。感谢分享!
0赞 Serge Stroobandt 6/23/2019
@rmuller 该命令是故意存在的,可以自动检测字符编码。我现在已经扩展了答案来解释这一点。对于读者来说,删除任何剩余的不相关的评论是礼貌的。谢谢。sed
0赞 rmuller 6/23/2019
@SergeStroobandt 也许我不够清楚。我的观点是,当您使用“file -b --mime-encoding”而不是“file -bi”时,无需使用 sed 过滤结果。此命令已仅返回文件编码。所以在你的例子“us-ascii”中
0赞 Aaron Franke 3/20/2020
在 Linux 上,这似乎对我没有任何作用。我将一个带有 BOM 的文件保存为 UTF-8,并希望它在没有 BOM 的情况下转换为 UTF-8,但事实并非如此。
1赞 Maciel Escudero Bombonato #10

编写属性文件(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)时,问题就解决了。

我希望这对某人有所帮助。

5赞 3 revs, 2 users 91%lalthomas #11

DOS/Windows:使用代码页

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

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

评论

0赞 Ali80 11/11/2020
正是医生吩咐的
1赞 Dorian #12

使用红宝石:

ruby -e "File.write('output.txt', File.read('input.txt').encode('UTF-8', 'binary', invalid: :replace, undef: :replace, replace: ''))"

来源:https://robots.thoughtbot.com/fight-back-utf-8-invalid-byte-sequences

0赞 kinORnirvana #13

使用此 Python 脚本: https://github.com/goerz/convert_encoding.py 适用于任何平台。需要 Python 2.7。

0赞 yota #14

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

  • 它使用户能够重新加载具有不同编码的文本(因此,可以直观地控制结果)
  • 另一个使用户能够在保存之前显式选择编码(和行尾字符)
1赞 Nikolai Varankine #15

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

0赞 tiennou #16

如果 macOS GUI 应用程序是您的面包和黄油,那么 SubEthaEdit 是我通常用于编码整理的文本编辑器——它的“转换预览”允许您查看输出编码中的所有无效字符,并修复/删除它们。

而且它现在是开源的,所以对他们来说😉太好了.

4赞 2 revsAmr Ali #17

试用 EncodingChecker

github 上的 EncodingChecker

文件编码检查器是一个 GUI 工具,可用于验证一个或多个文件的文本编码。该工具可以显示所有选定文件的编码,也可以仅显示没有您指定的编码的文件。

文件编码检查器需要 .NET 4 或更高版本才能运行。

对于编码检测,文件编码检查器使用 UtfUnknown 字符集检测器库。没有字节顺序标记 (BOM) 的 UTF-16 文本文件可以通过启发式方法检测。

在此处输入图像描述

评论

0赞 ollydbg23 7/20/2022
非常好的工具,它还可以将检测到的编码转换为用户指定的编码。
0赞 Henke 3/11/2023
你如何安装它?我没有找到任何说明。
1赞 2 revsAmr Ali #18

在 powershell 中:

function Recode($InCharset, $InFile, $OutCharset, $OutFile)  {
    # Read input file in the source encoding
    $Encoding = [System.Text.Encoding]::GetEncoding($InCharset)
    $Text = [System.IO.File]::ReadAllText($InFile, $Encoding)
    
    # Write output file in the destination encoding
    $Encoding = [System.Text.Encoding]::GetEncoding($OutCharset)    
    [System.IO.File]::WriteAllText($OutFile, $Text, $Encoding)
}

Recode Windows-1252 "$pwd\in.txt" utf8 "$pwd\out.txt" 

有关支持的编码名称列表:

https://learn.microsoft.com/en-us/dotnet/api/system.text.encoding

1赞 Pavel Morshenyuk #19

还有一个网络工具可以转换文件编码:https://webtool.cloud/change-file-encoding

它支持多种编码,包括一些罕见的编码,如 IBM 代码页 37。

8赞 Marcelo Ruggeri #20

假设您不知道输入编码并且仍然希望自动执行大部分转换,我通过总结以前的答案得出了这一的结论。

iconv -f $(chardetect input.text | awk '{print $2}') -t utf-8 -o output.text

评论

0赞 ollydbg23 7/20/2022
有没有关于此方法的 Windows 替代方法?谢谢。
0赞 Alex Czarto #21

Visual Studio 代码

  1. Visual Studio Code打开文件
  2. 使用编码重新打开:在右侧的底部状态栏中,您应该会看到当前文件编码(例如“UTF-8”)。单击此按钮并选择“使用编码重新打开”。
  3. 选择文件的正确编码(例如:ISO 8859-2)。
  4. 确认您的内容按预期显示。
  5. 使用编码保存:底部状态栏现在应显示您的新编码格式(例如:ISO 8859-2)。单击此按钮并选择“使用编码保存”,然后选择 UTF-8(或您想要的任何新编码)。

注意:这将覆盖您的原始文件。首先进行备份。