Vim显示奇怪的字符<91>,<92>


26

通过SSH使用Vim时,我将网页中的某些内容复制到了SSH / Vim会话中,并得到以下结果:

SIZE=`df -h|grep $DISC|awk <91>{print $2}<92>`

显然,<91><92>代表',但我怎么能搜索和替换这个东西?这是一个什么91/ 92是什么意思?由于91/ 92以ASCII的方式表示\和,因此如何编码[

Answers:


23

您的源网页上的内容被过分重新格式化。案文无疑应该使用(直)单引号(ASCII 39/0x27U+0027卷曲单引号代替)(U+2018U+2019,其是0x91 and 0x92在CP1252(也称为MS-ANSI和WINDOWS-1252;在Windows的公共8位编码)) 。

Vim向您显示十六进制代码,因为它们在Vim使用的任何编码中均无效(可能是UTF-8)。如果要编辑已保存在文件中的文本,则可以使用:e ++enc=cp1252;将文件重新加载为CP1252 。这应该使卷曲的引号可见。但是没有真正的理由将其重新加载为CP1252,只需删除0x910x92字符并将其替换为单引号即可。


您通常会从从MS Word复制的内容中获得大括号/单引号,该单词会自动插入大括号/单引号作为“智能引号”功能的一部分。如果您的字体不支持这些字符,则只会得到一个空格而不是字符。
lambacck 2010年

1
+1 for:e ++enc=cp1252
wfaulk

@ChrisJohnsen,是否有任何方法可以通过与完成相同功能的标志来调用vi :e ++enc=cp1252?如果我想从命令行使用vi包含MS单词字符的文件,那么一步就能做到,而不是打开vi,然后使用以下:e命令加载文件,这将是很好的选择
Leo Simon

@LeoSimon:vim --cmd 'set fileencodings=cp1252' /path/to/file—该命令在普通模式之前运行,.vimrc并设置fileencodings选项(注意结尾s;您也可以使用更短的名称fencs),这样Vim在加载文件时将仅尝试CP1252。这对于一次性编辑此类文件应该有效,但是如果您想使用该Vim实例来编辑其他编码的文件,则可能会导致复杂化。
克里斯·约翰森

谢谢!,明确地讲,我现在正在使用vim -c"set fencs" /path/to/file
Leo Simon

27

91和92是MS Windows默认版本的latin1 / ISO-8859-1编码中用于打开和关闭大括号的十六进制代码(单引号),更具体地称为cp1252 / Windows-1252(其中cp代表代码页)。

这些字符通常是人们从“ Word报价”功能的一部分复制Word文档/ Outlook电子邮件中的内容时插入的。此代码页中的其他问题字符是十六进制93/94,它们是打开和关闭的双引号,项目符号点(•)和OE连字(–和Œ)。您可以在Wikipeda页面上以绿色突出显示的“问题字符”的完整列表,这些问题字符不会以相同的代码直接映射到ISO-8859-1或UTF-8 中。

如果只需要以正确的编码打开文件,则对:e命令使用++ enc = cp1252选项:

:e ++enc=1252 filename.txt

您可以使用替代命令(:s)和以下一种代码替代来替换Vim中特定的错误十六进制代码:

\d123   decimal number of character
\o40    octal number of character up to 0377
\x20    hexadecimal number of character up to 0xff
\u20AC  hex. number of multibyte character up to 0xffff
\U1234  hex. number of multibyte character up to 0xffffffff

要更改十六进制91/92字符,您需要执行以下操作:

:%s/[\x91\x92]/'/g

最好使用bash命令替换目录中所有文件中的那些字符。我从Google的快速搜索sed -i "s/[\x91\x92]/\'/g" *.txt中想到了这一点,但没有成功。
Buttle Butkus

我刚刚发现一些似乎适用于命令行的东西。这会查找/替换当前文件夹中的所有.txt文件。但是,在使用它之前请先搜索perl,因为我不知道这些开关会做什么。perl -p -i -e "s/[\x91\x92]/'/g" *.txt
Buttle Butkus

2
sed -i "s/\x92/'/g"为我工作。
Karoly Horvath


-3

它们实际上代表十六进制91和92,它们在Windows代码页中是卷曲的单引号和右引号('和'-Alt-0145和Alt-0146)。

请尝试以下搜索/替换:

:s%/\<9[12]\>/'/g

1
由于缺少积分,我无法
投票

1
这对我不起作用:stackoverflow.com/questions/2798398/…提供了有效的解决方案。
混乱

@lambacck:我假设文件包含文字字符串“ 91”和“ 92”,在这种情况下,此命令是正确的。如果这些是十六进制字符,那么您是对的,您将需要替换命令或类似命令。
亚历克斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.