gpt4 book ai didi

unix - cat 输出与 vi 输出不同

转载 作者:行者123 更新时间:2023-12-02 21:07:49 24 4
gpt4 key购买 nike

当我抓取一个文件时,它会显示

"dest_info_s": "B\u001e�����"

当我进入它时,它显示:

"dest_info_s": "B\u001eøøïùÄ"

我认为这是由于文件编码方式造成的,并且 vi 正在执行一些 cat 无法执行的转换?如何删除文件上的编码以便它仅显示为文本?我想删除编码的原因是因为 sed 无法在文件上正确工作以进行替换,因为它将 sed 命令中的文本与编码文本进行比较,但没有得到匹配。

最佳答案

无论其存储在何处或在何种显示设备上打印,所有文本都必须使用一种或另一种编码进行编码。从文本文件中“删除编码”是不可能的。您所能做的就是将文本从源编码转换为目标编码。一段文本的编码就像能量:你无法创建或销毁它,你所能做的就是将它从一种形式转换为另一种形式。

打印一段文本时呈现的字素取决于(1)文本的编码,(2)打印文本的程序(具体来说,它在将数据传递给打印器之前是否进行任何编码转换)显示设备),以及(3)实际负责呈现文本的显示设备的配置和字体支持。就您而言,我们讨论的是 (1) 文本文件的编码,(2) cat 和 vim,以及 (3) 您的虚拟终端。

cat 实用程序大多不识别文本,并且从不进行任何文本编码转换;它基本上只是将从输入源接收到的字节复制到标准输出。

假设您没有使用非常旧的 vim 版本,它会动态检测文件的编码并捕获 'fileencoding' 设置中的编码(注意:对于此检测,它仅尝试 'fileencodings' 中指定的编码),使用 'encoding'用于其内部存储编码(与我们的目的无关),并在解释键盘输入和将文本打印到终端时使用 'termencoding'

根据您的示例输出,我猜测您的文本文件是每个字符一个字节的编码,可能是 latin1,并且您的终端配置为使用 UTF-8 编码。这就是为什么 cat 输出将最后 5 个字节渲染为 REPLACEMENT CHARACTER U+FFFD � 。这 5 个字节表示非 ASCII 字符,因此不是有效的 UTF-8。当您看到 U+FFFD 字形时,您的终端告诉您您发送了无效的 UTF-8。 (注意:有时终端使用 MEDIUM SHADE U+2592 ▒ 而不是 U+FFFD 来表示无效 UTF-8 的字节,有时您会看到显示设备字体不支持的有效 UTF-8 字符呈现不同的字素;请参阅 https://www.quora.com/What-symbol-is-the-square-box-shown-for-non-representable-Unicode-characters 。)

但是看起来vim正确地识别了文件编码,并且它的终端编码的想法也是正确的。因此,当它将文件内容打印到终端时,它会在源编码字节和相应的 UTF-8 表示形式之间正确进行转换。因此,5 个非 ASCII 字符作为正确的字素正确显示。

如果我的上述推论是正确的,那么您不需要更改任何设置; cat、vim 和您的终端都运行正常。

如果您希望能够手动将文件内容打印到终端,而不依赖于 vim,您可以使用 iconv 程序来执行必要的转换。像这样的东西(假设latin1是源编码):

iconv -f latin1 -t UTF-8 file.txt;

通常建议始终尝试使用 UTF-8。我不确定为什么您的 sed 命令不起作用(这取决于您未提供的 sed 命令的详细信息),但您可能可以通过存储文件的 UTF-8 编码版本来使其工作某处,然后对其运行 sed 命令:

iconv -f latin1 -t UTF-8 file.txt >file-utf8.txt;
sed '...' file-utf8.txt;

或者,您可以使用管道一次性完成:

iconv -f latin1 -t UTF-8 file.txt| sed '...';

关于unix - cat 输出与 vi 输出不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35169101/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com