提问人: 提问时间:9/16/2008 最后编辑:17 revs, 9 users 31%Antti Kissaniemi 更新时间:5/10/2022 访问量:611382
在字符集之间转换文本文件的最佳方法?
Best way to convert text files between character sets?
问:
在字符集之间转换文本文件的最快、最简单的工具或方法是什么?
具体来说,我需要从 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”。
- CsCvt - Kalytta 的字符集转换器是另一个很棒的基于命令行的 Windows 转换工具。
答:
iconv -f FROM-ENCODING -t TO-ENCODING file.txt
此外,还有许多语言的基于 iconv 的工具。
评论
在 Linux 下,您可以使用非常强大的 recode 命令来尝试在不同的字符集以及任何行尾问题之间进行转换。recode -l 将向您显示该工具可以转换的所有格式和编码。这可能是一个很长的清单。
评论
LF
/CR
/CR-LF
/LF
独立实用程序方法
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。
评论
iconv -l | grep UTF
chardet in.txt
iconv -f ENCODING
illegal input sequence at position
iconv -c -f UTF-8 -t ISO-8859-1//TRANSLIT in.txt > out.txt
file
iconv -f UTF-16 -t UTF-8...
iconv -f UTF-16LE...
Get-Content -Encoding UTF8 FILE-UTF8.TXT | Out-File -Encoding UTF7 FILE-UTF7.TXT
最短版本,如果可以假设输入物料清单正确:
gc FILE.TXT | Out-File -en utf7 file-utf7.txt
评论
gc .\file-utf8.txt | sc -en utf7 .\file-utf7.txt
Set-Content
Out-File
file-utf8.txt
file-utf7.txt
gc -en Ascii readme.html | Out-File -en UTF8 readme.html
PHP iconv() 中
iconv("UTF-8", "ISO-8859-15", $input);
评论
尝试 iconv Bash 函数
我把它放进去:.bashrc
utf8()
{
iconv -f ISO-8859-1 -t UTF-8 $1 > $1.tmp
rm $1
mv $1.tmp $1
}
..为了能够像这样转换文件:
utf8 MyClass.java
评论

试用记事本++
在 Windows 上,我能够使用 Notepad++ 进行从 ISO-8859-1 到 UTF-8 的转换。单击 ,然后单击 。"Encoding"
"Convert to UTF-8"
试用 VIM
如果有的话,你可以使用它:vim
未针对每种编码进行测试。
最酷的部分是,您不必知道源编码
vim +"set nobomb | set fenc=utf8 | x" filename.txt
请注意,此命令直接修改文件
解释部分!
+
:vim 用于在打开文件时直接输入命令。通常用于在特定行打开文件:vim +14 file.txt
|
:多个命令的分隔符(如 bash 中);
set nobomb
:没有 utf-8 BOMset fenc=utf8
:将新编码设置为 utf-8 文档链接x
:保存并关闭文件filename.txt
:文件的路径"
:Qotes 之所以在这里,是因为管道。(否则 bash 会将它们用作 bash 管道)
评论
vim -b
head file.txt|cat -e
find -regextype posix-extended -type f -regex ".*\.(h|cpp|rc|fx|cs|props|xaml)" -exec vim +'set nobomb | set fenc=utf8 | x' {} \;
使用查找的 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
因此,文件 -bi
表示:
-b
,不要在输出行前面添加文件名(简短模式)。--brief
-i
,使 file 命令输出 mime 类型的字符串,而不是更传统的人类可读字符串。因此,它可能会说例如而不是 .该命令仅根据 的要求将其剪切为 。--mime
text/plain; charset=us-ascii
ASCII text
sed
us-ascii
iconv
该命令对于此类文件管理自动化非常有用。
单击此处查看更多内容
。find
评论
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"' -- {} \;
sed
编写属性文件(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)时,问题就解决了。
我希望这对某人有所帮助。
DOS/Windows:使用代码页
chcp 65001>NUL
type ascii.txt > unicode.txt
命令可用于更改代码页。代码页 65001 是 UTF-8 的 Microsoft 名称。设置代码页后,以下命令生成的输出将是代码页集。chcp
评论
使用红宝石:
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
使用此 Python 脚本: https://github.com/goerz/convert_encoding.py 适用于任何平台。需要 Python 2.7。
我最喜欢的工具是Jedit(一个基于java的文本编辑器),它有两个非常方便的功能:
- 它使用户能够重新加载具有不同编码的文本(因此,可以直观地控制结果)
- 另一个使用户能够在保存之前显式选择编码(和行尾字符)
只需在状态栏右侧(底部)的 IntelliJ IDEA IDE 中更改已加载文件的编码,其中指示了当前字符集。它提示重新加载或转换,使用转换。确保提前备份了原始文件。
如果 macOS GUI 应用程序是您的面包和黄油,那么 SubEthaEdit 是我通常用于编码整理的文本编辑器——它的“转换预览”允许您查看输出编码中的所有无效字符,并修复/删除它们。
而且它现在是开源的,所以对他们来说😉太好了.
试用 EncodingChecker
文件编码检查器是一个 GUI 工具,可用于验证一个或多个文件的文本编码。该工具可以显示所有选定文件的编码,也可以仅显示没有您指定的编码的文件。
文件编码检查器需要 .NET 4 或更高版本才能运行。
对于编码检测,文件编码检查器使用 UtfUnknown 字符集检测器库。没有字节顺序标记 (BOM) 的 UTF-16 文本文件可以通过启发式方法检测。
评论
在 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
还有一个网络工具可以转换文件编码:https://webtool.cloud/change-file-encoding
它支持多种编码,包括一些罕见的编码,如 IBM 代码页 37。
假设您不知道输入编码并且仍然希望自动执行大部分转换,我通过总结以前的答案得出了这一行的结论。
iconv -f $(chardetect input.text | awk '{print $2}') -t utf-8 -o output.text
评论
Visual Studio 代码
- 在 Visual Studio Code 中打开文件
- 使用编码重新打开:在右侧的底部状态栏中,您应该会看到当前文件编码(例如“UTF-8”)。单击此按钮并选择“使用编码重新打开”。
- 选择文件的正确编码(例如:ISO 8859-2)。
- 确认您的内容按预期显示。
- 使用编码保存:底部状态栏现在应显示您的新编码格式(例如:ISO 8859-2)。单击此按钮并选择“使用编码保存”,然后选择 UTF-8(或您想要的任何新编码)。
注意:这将覆盖您的原始文件。首先进行备份。
评论
gc -en Ascii readme.html | Out-File -en UTF8 readme.html
recode
recode utf8..l9 < in.txt > out.txt
enca
enca -L ru -x utf8 FILE.TXT
iconv -f UTF-32 -t UTF-8 input.csv > output.csv
iconv -f UTF-32 -t UTF-8 file.csv