【问题标题】:What does '^@' mean in vim?'^@' 在 vi​​m 中是什么意思?
【发布时间】:2018-05-07 12:00:40
【问题描述】:

当我在 bash 中搜索文件时,我得到以下信息:

$ cat /tmp/file 
microsoft

当我在 vim 中查看相同的文件时,我得到以下信息:

^@m^@i^@c^@r^@o^@s^@o^@f^@t^@

如何识别和删除这些“不可打印”字符。 vim中的'^@'是什么意思??

(只是一个背景信息:该文件是通过base 64解码和从Microsoft Playready的mpd文件的pssh头中剪切创建的)

【问题讨论】:

  • 我不应该在正常模式下输入“ga”时显示字符: 0, Hex 00, Octal 000

标签: bash vim cat playready pssh


【解决方案1】:

您看到的是 Vim 对不可打印字符的可视化表示。在:help 'isprint'解释:

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

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

对于空文件或只有 ASCII 字符的文件,大多数编码 将起作用并且将使用“fileencodings”的第一个条目(除了 “ucs-bom”,它要求 BOM 存在)。

这就是为什么 字节顺序标记 (BOM) 被推荐用于 16 位编码的原因;但这假设您可以控制输出编码。

【讨论】:

    【解决方案2】:

    ^@ 是 Vim 对空字节的表示。 ^ 表示不可打印的控制字符,后面的 ASCII 字符表示 它是哪个控制字符。

    ^@ == 0 (NUL)
    ^A == 1
    ^B == 2
    ...
    ^H == 8
    ^K == 11
    ...
    ^Z == 26
    ^[ == 27
    ^\ == 28
    ^] == 29
    ^^ == 30
    ^_ == 31
    ^? == 127
    

    9 和 10 没有被转义,因为它们分别是 Tab 和 Line Feed。

    32 到 126 是可打印的 ASCII 字符(以空格开头)。

    【讨论】:

    • 感谢您的回答。这是直接和重点。我接受的答案给了我更多的背景信息,这就是我接受它的原因。但是,我也对您的答案投了赞成票。
    • 没问题; Ingo 以更有用的方式清楚地回答了您的问题,
    猜你喜欢
    • 2015-12-16
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 2017-01-03
    • 1970-01-01
    • 1970-01-01
    • 2011-08-16
    相关资源
    最近更新 更多