如何修复 .txt 文件中的奇怪字符?

如何修复 .txt 文件中的奇怪字符?

我在 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 -aprints -iutf8

相关内容