【问题标题】:Best way to convert text files between character sets?在字符集之间转换文本文件的最佳方法?
【发布时间】:2010-09-09 01:19:54
【问题描述】:

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

具体来说,我需要从 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所指出的,有一个online converter using iconv

  • Cheekysoft 建议的

    recode (manual) 将就地转换一个或多个文件。示例:

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

    这个使用较短的别名:

      $ recode utf8..l9 in.txt
    

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

    将换行从 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 (Jay Bazuzi) 的 Windows 上:

  • 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”。

【问题讨论】:

  • 我试过gc -en Ascii readme.html | Out-File -en UTF8 readme.html,但它会将文件转换为utf-8,但它是空的! Notepad++ 说该文件是 Ansi 格式,但据我了解,它甚至不是有效的字符集? uk.answers.yahoo.com/question/index?qid=20100927014115AAiRExF
  • 刚刚遇到这个寻找相关问题的答案 - 很棒的总结!只是认为值得添加 recode 如果您不传递任何文件名,它也将充当过滤器,例如:recode utf8..l9 < in.txt > out.txt
  • iconv.com/iconv.htm 对我来说似乎已经死了? (超时)
  • 如果使用enca,则无需指定输入编码。通常只需指定语言即可:enca -L ru -x utf8 FILE.TXT
  • 实际上,iconv 作为就地转换器而不是过滤器效果更好。使用iconv -f UTF-32 -t UTF-8 input.csv > output.csv 转换一个超过 200 万行的文件只节省了大约 70 万行,只有三分之一。使用就地版本iconv -f UTF-32 -t UTF-8 file.csv 成功转换了所有 200 万行以上。

标签: text unicode utf-8 character-set


【解决方案1】:

Stand-alone utility 接近

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。

【讨论】:

  • 对于因非破折号版本不可用而被绊倒的任何其他人,看起来 OSX(可能还有所有 BSD)版本的 iconv 不支持各种 UTF 的非破折号别名-* 编码。 iconv -l | grep UTF 将告诉您您的 iconv 副本支持的所有 UTF 相关编码。
  • 不知道输入文件的编码?使用chardet in.txt 生成最佳猜测。结果可以用作iconv -f ENCODING中的ENCODING。
  • 防止在无效字符处退出(避免illegal input sequence at position消息),并将“奇怪”字符替换为“相似”字符:iconv -c -f UTF-8 -t ISO-8859-1//TRANSLIT in.txt > out.txt
  • 我喜欢这个,因为它是大多数 NIX 平台上的标准。但也可以查看 VIM 命令选项(别名:exbelow。附加信息:(1)您(可能)不需要使用iconv 指定-f(来自)选项。 (2)file --mime-encoding <file/s>命令可以帮助你首先弄清楚编码。
  • FWIW file 命令将我的源报告为 UTF-16 Little Endian;运行 iconv -f UTF-16 -t UTF-8... 将其错误地转换为 ASCII,我必须明确指定 iconv -f UTF-16LE... 以输出 UTF-8
【解决方案2】:

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

【讨论】:

  • 很酷,但有点慢。有没有办法改变它以一次转换多个文件(从而节省 vim 的初始化成本)?
  • 感谢您的解释!在阅读有关炸弹/无炸弹设置之前,我在文件开头遇到了困难。
  • np,另外,如果你使用vim -bhead file.txt|cat -e,你可以查看bom
  • 例如: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 命令之前的列数不同。想知道是否可以只打开文件、转换编码并保存/关闭文件,同时保持所有其他文件内容相同?
【解决方案3】:

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

【讨论】:

  • 如何转换为LF?有/CR/CR-LF 但没有/LF
【解决方案4】:

iconv(1)

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

还有多种语言的基于 iconv 的工具。

【讨论】:

  • 自动检测原始编码怎么样?
【解决方案5】:
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

【讨论】:

  • 这是一个更短的版本,效果更好。 gc .\file-utf8.txt | sc -en utf7 .\file-utf7.txt
  • @LarryBattle:Set-Content 如何比Out-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
【解决方案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

【讨论】:

  • 最好使用 tmp=$(mktmp) 创建临时文件。此外,带有 rm 的行是多余的。
  • 你能用自动检测输入格式来完成这个功能吗?
  • 注意,这个函数会删除输入文件而不验证iconv调用是否成功。
  • 这会改变文本文件的内容。我在带有 BOM 的 UTF-8 上运行此程序,希望得到一个没有 BOM 文件的 UTF-8,但它在文件开头添加了 
【解决方案7】:

试试记事本++

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

【讨论】:

    【解决方案8】:

    使用 find 的 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-8 输出文件暂时命名为converted

    其中file -bi 表示:

    • -b, --brief 不要将文件名添加到输出行(简要模式)。

    • -i, --mime 使 file 命令输出 mime 类型的字符串,而不是更传统的人类可读的字符串。因此它可能会说例如text/plain; charset=us-ascii 而不是ASCII text。根据iconv 的要求,sed 命令将其缩减为仅us-ascii

    find 命令对于此类文件管理自动化非常有用。 点击这里查看more find galore

    【讨论】:

    • 我必须稍微调整一下这个解决方案才能在 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"' -- {} \;
    • 您的代码也可以在带有 MinGW-w64(最新版本)的 Windows 7 上运行。感谢分享!
    • @rmuller sed 命令是故意存在的,可以自动检测字符编码。我现在已经扩展了答案来解释这一点。对于读者而言,删除任何剩余的不相关的 cmets 将是礼貌的。谢谢。
    • @SergeStroobandt 也许我不够清楚。我的观点是,当您使用“file -b --mime-encoding”而不是“file -bi”时,不需要使用 sed 过滤结果。此命令已仅返回文件编码。所以在你的例子中“us-ascii”
    • 这在 Linux 上似乎对我没有任何作用。我将一个文件保存为带有 BOM 的 UTF-8,并希望它在没有 BOM 的情况下转换为 UTF-8,但它没有。
    【解决方案9】:

    DOS/Windows:使用Code page

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

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

    【讨论】:

    • Doc.订购
    【解决方案10】:

    PHP iconv()

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

    【讨论】:

    • 此语句在转换字符串时效果很好,但不适用于文件。
    【解决方案11】:

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

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

    【讨论】:

      【解决方案12】:

      要写属性文件(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:我用葡萄牙语写了 Execution number one/two 来强制使用特殊字符。

      就我而言,在第一次执行时我收到了这条消息:

      $ 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) 时,问题就解决了。

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

      【讨论】:

        【解决方案13】:

        试试 EncodingChecker

        EncodingChecker on github

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

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

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

        【讨论】:

          【解决方案14】:

          在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://docs.microsoft.com/en-us/dotnet/api/system.text.encoding

          【讨论】:

            【解决方案15】:

            用红宝石:

            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

            【讨论】:

              【解决方案16】:

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

              【讨论】:

                【解决方案17】:

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

                • 使用户能够重新加载具有不同编码的文本(并因此以视觉方式控制结果)
                • 另一个允许用户在保存前明确选择编码(和行尾字符)

                【讨论】:

                  【解决方案18】:

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

                  【讨论】:

                    【解决方案19】:

                    如果 macOS GUI 应用程序是您的生计,SubEthaEdit 是我经常使用的文本编辑器进行编码处理 — 它的“转换预览”允许您查看输出编码中的所有无效字符,并修复/删除他们。

                    现在是open-source,所以为他们加油?。

                    【讨论】:

                      【解决方案20】:

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

                      它支持广泛的编码,包括一些罕见的编码,例如 IBM 代码页 37。

                      【讨论】:

                        【解决方案21】:

                        How do I correct the character encoding of a file? 中所述,Synalyze It! 可让您在 OS X 上轻松地在ICU library 支持的所有编码之间进行转换。

                        此外,您可以显示从所有编码转换为 Unicode 的文件的一些字节,以便快速查看哪个字节适合您的文件。

                        【讨论】:

                          猜你喜欢
                          • 2015-10-09
                          • 2014-04-15
                          • 1970-01-01
                          • 2020-06-20
                          • 1970-01-01
                          • 2010-09-17
                          • 2011-03-13
                          • 2014-01-05
                          相关资源
                          最近更新 更多