C文件中的中文注释引起不能自动补全

如题,我include了别人的API头文件,其中包括了中文注释,在我的文件里,如果输入ui,可以出现uintXX的自动补全,但是如果输入p(头文件中有个结构体类型定义为ProgramXX),则提示错误:

UnicodeDecodeError: 'utf8' codec can't decode byte X in position X: invalid start byte

最初以为是字体问题,但是替换为微软雅黑也不行。 我的emacs版本是25.2,用了ycmd layer,可能是company-ycmd

编碼问題。用 iconv 转码。

额,我用file查看文件属性发现是ISO-8859格式的,iconv强行转码成UTF-8格式之后,中文就全变成乱码了,请问这个有办法破解么?

还会报错吗?

错误不会报了,只是以前虽然会报错,但是可以正常显示中文,现在不报错了,但是中文的部分都变成了乱码。。

把文件关掉 让 emacs 重新读转换过的文件编码。

怀疑 file 看到的文件属性是错误的,如果真是 ISO-8859 格式,能显示中文也是奇迹了。

请问用emacs怎么读呢…

-ι_- 就是关闭重新打开文件,就行。。。人自己会读。


使用 iconv 命令的时候不要指定源文件的编码,这样试试看:

iconv -t UTF-8 file.txt > new.txt

只是关闭重读的话一直会出现本帖开始描述的错误,毕竟遇到问题想到的第一件事都是重启试试嘛。。。

只是iconv -t UTF-8 的话,会报错

我的命令是这样的:

iconv -f ISO-8859-16 -t UTF-8 file > outfile

什么系统?报错什么信息?我这里 macOS iconv 命令没报错。

随便用别的编辑器(比如 Vim)转换下编码,看看有没有效果吧。

ubuntu 16.04,错误是

iconv: 未知 5634处的非法输入序列

vim什么的怎么看他解析成了什么编码格式。。。我不会用。。。

PS:在VIM里面直接就是乱码。。。都看不出来中文。。。

还是你 file 输入的文件编码不对,导致 iconv 的转换没完成。

Vim 里使用 :set fileencoding 就知道被识别为啥编码格式,:set fileencoding=utf-8 再把 buffer 写到文件就转成 utf-8 编码了。

可以试试别的编辑器,比如 gedit 啊 sublime text 等。

你的 locale -a 输出是啥?

locale -a输出

C
C.UTF-8
en_AG
en_AG.utf8
en_AU.utf8
en_BW.utf8
en_CA.utf8
en_CA.utf8
en_DK.utf8
en_GB.utf8
en_HK.utf8
en_IE.utf8
en_IN
en_IN.utf8
en_NG
en_NG.utf8
en_NZ.utf8
en_PH.utf8
en_SG.utf8
en_US.utf8
en_ZA.utf8
en_ZM
en_ZM.utf8
en_ZW.utf8
POSIX
zh_CN.utf8
zh_SG.utf8

在vim里输入:set fileencoding,显示fileencoding=latin1。。。拉丁解码么这是。。。中文直接乱码。。。

gedit我没查到怎么查看当前用的什么编码,sublime的话我电脑安装起来不是很方便,公司电脑不让上网

ISO-8859 是拉丁字符集,file 命令不准确,我随手就能给出一个实例:

⋊> file --mime-encoding ~/.repos/you-get_install/you-get.bat
/Users/gqj/.repos/you-get_install/you-get.bat: iso-8859-1

⋊> uchardet ~/.repos/you-get_install/you-get.bat
GB18030

别人的一般都是windows下的,基本都是gbk的,然后有个别跟英文混一起会导致乱码。用16进制找到,多加个空格就好了……

Vim 中文显示乱码加一行配置就行了:

set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1

gedit 不行,还不让上网。。。Kate 呢?

带中文的编码多半为 gbk,试试直接使用 iconv -f GBK 命令转下吧。

@twlz0ne 我咋就没想起 uchardet 这命令呢。。。@deep 如果你能用 pip 的话,你安装尝试下。

反正用你能找到的随便什么方法,转换文件格式到 utf-8。尽快确认到底是 emacs 设置还是 ycmd 的问题。

>_<↯↯ 这都什么歪门邪道。。。


刚读了 Vim 手册,优化一下文件编码设置:

set fileencodings=utf8,chinese,taiwan,japan,korea,ansi

感觉比之前好理解多了,应该简繁日韩环境下使用都没问题,还没测试。不过应该没问题。

thanks to all.

我确实不会用Vim,所以不想纠结Vim里面是乱码的问题了。其他的工具我电脑上都没装,可能试不了了

iconv -f GBK一开始是不行的,后来我用datura(忘了怎么@人了。。)的查16进制的方法找到两个不正常的-符号,改掉都就可以用了。现在转完了感觉没啥问题。

个人感觉像是ycmd的问题,因为一开始报的那个错误是python的一个错误。细节因为我对python和ycmd都不是很熟悉,就不太了解了。

不用 utf-8 编码的人不知道给别人造成了多大麻烦