我有一个文本文件(实际上是从 LibreOffice 中的 .xlsx 导出的 .csv),在 LibreOffice Calc 中打开时,其中的行显示为乱码。在 VIM 中,它们显示如下:
Joe User, [email protected], p@ss<96>w0rd
这<96>
曾是一些与 相似的有趣字符-
,但 MS Office 决定将其更改为其他字符。因此该文件不是ASCII:
$ file -i Users.csv
Users.csv: text/plain; charset=unknown-8bit
请注意,所有这些“有趣”字符的代码点都小于 127,所以我真的不知道 Calc 和 VIM 如何意识到这不是 ASCII。哪些其他编码的所有代码点都低于 127,即不兼容 ASCII?此外,如何在 VIM 中搜索这些字符?对于 127 以上的非 ASCII 字符我使用/[^\x00-\x127]
搜索,但当然不会找到<96>
。
原始 .xlsx 文件仍然可以在另一个用户的 Windows 计算机上找到,果然我可以在他的 MS Office 中验证该<96>
字符不是 ASCII 96 `,而是 的一些有趣变体'。
答案1
<96>
不是 ASCII 96:它是 UTF-8 U+0096
(拉丁语 1 扩展的一部分)的表示,“受保护区域的开始”,不管它是什么意思。
您可以点击ga
查看光标下字符的信息。对于<96>
,您将获得以下内容:
<<96>> 150, Hex 0096, Octal 226
您可以使用以下命令从缓冲区中删除该字符:
:%s/<C-v>u0096//g
看起来应该是这样的:
:%s/<96>//g
或者你可以这样做:
:%s/\%u0096//g " hex form
或者:
:%s/\%d150//g " decimal form
或者:
:%/\%o226//g " octal form
看:help ga
,:help utf-8-typing
,:help \%u
。