当我在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标题中剪切而来的)
答案 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开头)。