最新消息:

vim写的java代码编译运行"错误: 编码GBK的不可映射字符"

Vim 大步 1180浏览 0评论

用vim写的java代码编译运行时候,编译会有报错"错误: 编码GBK的不可映射字符" 。但
可以正常运行。

原因:因为在vim中设定的创建新文件后的默认编码是utf-8 的, 在linux上是没什么问
题的,但是我这时gvim,而用vim新建的java源代码是在 windows上编译运行,就会有"错
误: 编码GBK的不可映射字符"  。因为windows 是要求文件是 gbk 编码的,这样在java
源代码编译的时候,代码中的中文就会导致报错。

解决办法:
方案一:将其中的中文全改成英文。 治标不治本。
方案二:转换文件的编码格式。我们先用vim打开报错的文件,在vim执行下面的命令来打
印文件的编码:

:set fileencoding   然后回车

显示为:
utf-8

然后再接着用命令转换文件格式:

:set fileencoding=gbk    然后回车

转换好后,我们再次编译运行java源代码文件,就不会有“错误: 编码GBK的不可映射字符
”报错提示了。

附上网上的l两篇文章:

本文主要讲解下,让Vim能正确显示和保存各种编码文件的一些常用方法。

Vim编码配置里面有3个选项,分别是encoding 、fileencodings、fileencoding 简写分别对应为enc、fencs、fenc。

encoding(enc): 此项目配置的是vim的默认显示编码,如果你打开的文件编码与该属性配置的编码不同,那么Vim会将编码自动转换到这种编码然后再显示,

如果如果这2种编码集合完全对应那么很有可能出现坏块也就是没转换成功然后从列表(下面就讲到,实际上就是fens)中搜寻下一个编码,也就是出现我们所说的乱码。

验证上述结论:用vim打开一个文件,输入":set encoding" vim 会自动把encoding的值打印出来。

fileencodings(fencs): 此项目配置的是一个编码列表,Vim在读取文件的时候,会根据这里的编码自动检测,如果检测失败则尝试下一个,直到检测成功为止。如果一直没有转换成功,则此值会为空,也就是上述encoding的枚举,你可以重新调整循序来调整优先级。(需要在.vimrc中修改)

验证上述结论:同上,打印fencs的值(fencs 就是 fileencodings)

fileencoding(fenc):这个东西尤其重要这个配置的是新建文件和保存文件时文件的编码,如果它的值与encoding(enc)不一样,那么保存的时候Vim会自动把文件内容由encoding(enc)的编码转换为fileencoding(fenc)配置编码再保存。而读取文件的时候,该选项的值会自动同步为fileencodings(fencs):配置的有效编码。(实际上就是上面说的转换规则)

例如:

如果我们是如下配置

encoding(enc):utf-8

fileencodings(fencs):utf-8,gbk

fileencoding(fenc):gbk

那么我们打开一个gbk编码的文件,Vim会将内容转换为utf-8格式来显示,但是保存的时候文件的编码却依然是gbk

如果我的工作环境主要是编辑utf-8,偶尔会修改一下gbk的编码,我们该怎么配置呢?

首先我们可以把fileencoding留空,然后只配置fileencodings(fencs):utf-8,gbk,ucs-bom,cp936(这个需要在.vimrc中配置,不然下一次打开不会改变,而且这个列表是打开后不能改的,改了也没效果)

按照上面的规则,Vim就会自动把文件保存为gbk的编码了

如果我编辑了一个utf-8文件,想把它以gbk的格式保存,该怎么办呢?

在命令行模式输入 :set fenc=gbk 然后保存文件即可,保存之后再输入:set fenc=utf-8就可以继续编辑其他utf-8文件了          ——引自《vim 用指定编码保存文件

 

####################华丽的分割线#####################

第二篇:

VIM中,我们可以通过修改/etc/vimrc文件来设置VIM的encoding,我们可以通过:help encoding来察看vim中关于encoding的一些帮助,:help encoding-values可以看到vim支持的encoding的值。
vim的encoding设置通常有三个参数:
1。encoding
表示vim自身内部使用的编码方式,如内部缓冲,菜单,消息等的编码方式。如果你现在正以不同于encoding的编码编辑一个文件,如使用set,它并不决定文件被保存的编码方式,也不能指导vim我们要打开的文件是什么格式。它不是作这个用的。
2。fileencoding
表示VIM所认为的当前被处理的文件的编码格式,即告诉我们当前打开的文件的格式。而且如果我们保存文件的话,vim也会以此格式保存,就算这个 fileencoding并不是真正的fileencoding。举个例子,有个文件是utf-8编码,而且我们的vim将他成功打开了,即vim识别出 他是utf-8编码,这样我们在vim里面执行:set fileencoding命令得到的结果就是fileencoding=utf-8,可见vim已经识别出了这个文件的格式,而且以此格式对文件操作,如 果我们手动修改fileencoding即:执行:set fileencoding=cp936的话,然后保存文件,得到的文件就将自动被转换成了cp936格式,可以用file filename命令来查看该文件的格式,的确如此。如果还想转换回来,就可以像刚才那样再次用vim打开,然后:set fileencoding=utf-8然后保存,当然也可以用iconv命令即:
iconv -f cp936 -t utf-8 -o targetfile sourcefile 即将按照cp936格式编码的文件sourcefile转换成按照utf-8编码的文件targetfile. 此外,不管你怎么变换,我们一直没有改动encoding,而且使用:set encoding命令查看其值,也是一直没有变,它的值如果我们不人工指定的话,一般来说默认等于我们的LANG里面的设置的字符集,我们目前默认的 LANG=en_US.UTF-8,encoding一般会与LANG的locale设置保持一致的。可见,不管你认为文件是什么格式,我的 encoding一直不变,那么我再进行文件处理的时候,就会在内部用一种格式,即encoding指定的格式,当然首先要从fileencoding指 定的格式转换成encoding的格式,处理后,在转换成fileencoding的格式,具体的转换依赖的是iconv的功能。
那么,fileencoding的格式我们总不能每打开一个文件手动指定吧,vim时可以自动检查的,当检查成功后,就会自动设置fileencoding的值,这就是fileencodings的功能。
3。fileencodings
这是一个列表,他一般包含多个值,VIM在打开文件的时候会从这个列表中依次拿出一个值与被打开的文件比较,直到找到匹配的编码方式a。然后fileencoding就会被设置成a。这样当你对文件编辑的时候就会使用a.

下面是一段网上的介绍的摘抄:
vim里面的编码主要跟三个参数有关:enc(encoding), fenc(fileencoding)和fencs(fileencodings)
其中fenc是当前文档的编码,也就是说,一个在vim里面已正确显示了的文档(前提是您的系统环境跟您的enc配置匹配),您能够通过改变fenc后再 w来将此文档存成不同的编码。比如说,我:set fenc=utf-8然后:w就把文档存成utf-8的了,:set fenc=gb18030再:w就把文档存成gb18030的了。这个值对于打开文档的时候是否能够正确地解码没有任何关系。
fencs就是用来在打开文档的时候进行解码的猜测列表。文档编码没有百分百正确的判断方法,所以vim只能猜测文档编码。比如我的vimrc里面这个的配置是
set fileencodings=utf-8,gb18030,utf-16,big5
所以我的vim每打开一个文档,先尝试用utf-8进行解码,假如用utf-8解码到了一半出错(所谓出错的意思是某个地方无法用utf-8正确地解 码),那么就从头来用gb18030重新尝试解码,假如gb18030又出错(注意gb18030并不是像utf-8似的规则编码,所以所谓的出错只是说 某个编码没有对应的有意义的字,比如0),就尝试用utf-16,仍然出错就尝试用big5。这一趟下来,假如中间的某次解码从头到尾都没有出错,那么 vim就认为这个文档是这个编码的,不会再进行后面的尝试了。这个时候,fenc的值就会被设为vim最后采用的编码值,能够用:set fenc?来查看具体是什么。
当然这个也是有可能出错的,比如您的文档是gb18030编码的,但是实际上只有一两个字符是中文,那么有可能他们正好也能被utf-8解码,那么这个文档就会被误认为是utf-8的导致错误解码。
至于enc,其作用基本只是显示。不管最后的文档是什么编码的,vim都会将其转换为当前系统编码来进行处理,这样才能在当前系统里面正确地显示出来,因 此enc就是干这个的。在windows下面,enc默认是cp936,这也就是中文windows的默认编码,所以enc是无需改的。在linux下, 随着您的系统locale可能设为zh_CN.gb18030或zh_CN.utf-8,您的enc要对应的设为gb18030或utf-8(或gbk之 类的)。
最后再来说一下新建空文档的默认编码。看文档似乎说会采用fencs里面的第一个编码作为新建文档的默认编码。但是这里有一个问题,就是fencs的顺序 跟解码成功率有很大关系,根据我的经验utf-8在前比gb18030在前成功率要高一些,那么假如我新建文档默认想让他是gb18030编码怎么办?一 个方法是每次新建文档后都:set fenc=gb18030一下,但是我发现在vimrc里面配置fenc=gb18030也能达到这个效果。
总结一下,我的vimrc里面的配置是:
set fileencoding=gb18030
set fileencodings=utf-8,gb18030,utf-16,big5
另外enc根据环境来设。

——引自《VIM中字符编码的设置

 

 

转载请注明:大步's Blog » vim写的java代码编译运行"错误: 编码GBK的不可映射字符"

SiteMap