'^ @'在vim中意味着什么?

mur*_*ngu 3 vim bash cat playready pssh

当我在bash中捕获文件时,我得到以下内容:

$ cat /tmp/file 
microsoft
Run Code Online (Sandbox Code Playgroud)

当我在vim中查看同一个文件时,我得到以下内容:

^@m^@i^@c^@r^@o^@s^@o^@f^@t^@
Run Code Online (Sandbox Code Playgroud)

如何识别和删除这些"不可打印"的字符.什么'^ @'在vim中意味着什么?

(只是一个背景信息:该文件是由base 64解码并从Microsoft Playready的mpd文件的pssh头切割而创建的)

Ing*_*kat 5

你看到的是Vim对不可打印角色的直观表现.它的解释:help 'isprint'如下:

Non-printable characters are displayed with two characters:
    0 -  31   "^@" - "^_"
   32 - 126   always single characters
     127      "^?"
  128 - 159   "~@" - "~_"
  160 - 254   "| " - "|~"
     255      "~?"
Run Code Online (Sandbox Code Playgroud)

因此,^@代表空字节 = 0x00.这些(和其他不可打印的字符)可以来自各种来源,但在你的情况下它是......

编码问题

如果你在Vim中清楚地观察到你的输出,那么每个第二个字节都是一个空字节 ; 中间是预期的字符.这清楚地表明该文件使用多字节编码(utf-16大端,没有精确的字节顺序标记),并且Vim没有正确检测到它,而是将文件打开为latin1左右(而事情在终奌站).

要解决此问题,您可以显式指定编码:

:edit ++enc=utf-16 /tmp/file
Run Code Online (Sandbox Code Playgroud)

或者调整'fileencodings'选项,以便Vim可以自动检测到这一点.但是,请注意,模糊(如在您的情况下)使这容易失败:

对于空文件或仅包含ASCII字符的文件,大多数编码都可以使用,并且将使用'fileencodings'的第一个条目("ucs-bom"除外,这需要BOM存在).

这就是为什么建议16位编码使用字节顺序标记(BOM); 但这假设您可以控制输出编码.