![如何修复 .txt 文件中的奇怪字符?](https://linux22.com/image/168058/%E5%A6%82%E4%BD%95%E4%BF%AE%E5%A4%8D%20.txt%20%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%E5%A5%87%E6%80%AA%E5%AD%97%E7%AC%A6%EF%BC%9F.png)
我在 Windows 上的 Visual Studio 中编辑了一个 .txt 文件,然后将其复制到 HPC 服务器中。该文件一开始对我来说看起来不错,
但是当我在linux环境中打开它时,出现了奇怪的字符(实际上,它问我"sampleID.txt" may be a binary file. See it anyway?
)。我相信字符编码有些错误,但不知道是什么导致了这种情况,因为当我尝试在 Visual Studio 中保存此文件时,它告诉我“此文件中的某些 Unicode 字符无法保存在当前代码页中”是否要将此文件重新保存为 Unicode 以维护您的数据?”。有谁有一个简单的方法来修复这个文件?多谢!
答案1
前 3 个字节是错误使用的字节顺序标记,已转换为 utf-8。 utf-8 不应使用字节顺序标记。
其他 3 个重复字符是 a −
(不是 a -
)。
这些在 Debian Gnu/Linux 中通过终端、emacs 等显示良好。
您可能需要正确设置您的区域设置,以减少工作量。
例如,对于英国英语(对于美国,请将 GB 更改为美国。对于其他语言,请查找,但确保它们包含 utf8。现在,您应该对所有本地语言使用 utf-8,其他编码已过时且相互不兼容)。
LANG=en_GB.utf8
LANGUAGE=en_GB
LC_CTYPE="en_GB.utf8"
LC_NUMERIC="en_GB.utf8"
LC_TIME=en_GB.utf8
LC_COLLATE="en_GB.utf8"
LC_MONETARY="en_GB.utf8"
LC_MESSAGES="en_GB.utf8"
LC_PAPER="en_GB.utf8"
LC_NAME="en_GB.utf8"
LC_ADDRESS="en_GB.utf8"
LC_TELEPHONE="en_GB.utf8"
LC_MEASUREMENT="en_GB.utf8"
LC_IDENTIFICATION="en_GB.utf8"
LC_ALL=
答案2
您的文件可以通过以下方式在使用 UTF-8 编码的系统中重现:
{ printf '\xef\xbb\xbf';
for i in {3..6}; do
printf '%s\r\n' ped1_D$((2*(i-2)+2))_{1..3}_g$i−b1−{s,i}1;
done;
} >file
然后,是的,less
如果编码不是 UTF-8,该命令将询问文件是否是二进制文件,这可以通过以下方式重现:
LC_ALL=C less file
是的,它显示了许多特殊字符。
但这只发生在 LESS 中,大多数其他编辑器:nano、vi、emacs 都可以打开文件而不会被 DOS 编码误导。
删除行尾的回车符 (\r) 的最简单方法和自动删除不需要的BOM(字节顺序标记)是使用dos2unix。 UTF-8是一种面向字节的格式,不需要重新排序字节,所有字节都按网络顺序工作。只有在 16 位或 32 位字符的编码中 BOM 才有用。
dos2unix file
但您系统中的真正问题是它没有使用 utf-8 默认编码。现在大多数操作系统默认使用 utf-8。如下所示:
LC_ALL=en_US.UTF-8 less file
请确保locale
打印名称中包含 utf-8 的编码,并且如果需要,请确保您的控制台使用 utf-8 进行编码:stty -a
prints -iutf8
。