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头切割而创建的)
你看到的是Vim对不可打印角色的直观表现.它的解释:help 'isprint'
如下:
Run Code Online (Sandbox Code Playgroud)Non-printable characters are displayed with two characters: 0 - 31 "^@" - "^_" 32 - 126 always single characters 127 "^?" 128 - 159 "~@" - "~_" 160 - 254 "| " - "|~" 255 "~?"
因此,^@
代表空字节 = 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); 但这假设您可以控制输出编码.