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

时间:2017-11-23 13:37:33

标签: bash vim cat playready pssh

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

Support.objects.all().annotate(
             datediff=ExpressionWrapper(
                 Func(F('end_at')-Now(), function='ABS'),
                 output_field=DurationField())
         ).order_by('datediff', 'id')

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

$ cat /tmp/file 
microsoft

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

(只是一个背景信息:该文件是由base 64解码并从用于Microsoft Playready的mpd文件的pssh标题中剪切而来的)

2 个答案:

答案 0 :(得分: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      "~?"

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

编码问题

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

要解决此问题,您可以明确指定编码:

:edit ++enc=utf-16 /tmp/file

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

  

对于空文件或仅包含ASCII字符的文件,大多数编码     将工作,'fileencodings'的第一个条目将被使用(除了     “ucs-bom”,需要BOM存在。)

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

答案 1 :(得分:2)

*ngFor="let country of countries" 是Vim对空字节的表示。 ^@表示不可打印的控制字符,指示以下ASCII字符 控制角色是什么。

^

9和10不会被转义,因为它们分别是制表符和换行符。

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