gvim下euc-cn与cp936编码的异同

Vim、Emacs配置和使用
sarrow
帖子: 403
注册时间: 2007-10-27 1:04

gvim下euc-cn与cp936编码的异同

#1

帖子 sarrow » 2011-12-19 19:42

在gvim下,euc-cn与cp936编码有什么异同?

我新建文件的时候,gvim总是默认给我euc-cn的编码。而我经常会遇到保存出错的清空——
gvim提示我,将fencoding置空;

而我执行:
:set fencoding=cp936

:w
就没问题了。

两者的字符集不完全一致,还是根本就是两码事?

另外,建议使用utf8编码的,我想说utf8可以说是通吃编码,但个人不是很喜欢它——毕竟
,纯中文的文件的话,这个编码要比cp936多费一半的存储空间。
sarrow
帖子: 403
注册时间: 2007-10-27 1:04

Re: gvim下euc-cn与cp936编码的异同

#2

帖子 sarrow » 2011-12-19 19:49

EUC-CN
http://baike.baidu.com/view/968237.htm
  EUC-CN是GB2312最常用的表示方法。浏览器编码表上的“GB2312”,通常都是指“EUC-CN”表示法。
  GB 2312字元使用两个字节来表示。
  “第一位字节”使用0xA1-0xFE
  “第二位字节”使用0xA1-0xFE
  举例来说,“啊”字是GB 2312之中的第一个汉字,它的区位码是1601。
  在EUC-CN之中,它把0xA0+16=0xB0,0xA0+1=0xA1,得出0xB0A1。
=======================================================
 GBK
  GBK编码是GB2312编码的超集,向下完全兼容GB2312,同时GBK收录了Unicode基本多文种平面中的所有CJK汉字。同 GB2312一样,GBK也支持希腊字母、日文假名字母、俄语字母等字符,但不支持韩语中的表音字符(非汉字字符)。GBK还收录了GB2312不包含的 汉字部首符号、竖排标点符号等字符。
  GBK的整体编码范围是为0x8140-0xFEFE,不包括低字节是0×7F的组合。高字节范围是0×81-0xFE,低字节范围是0x40-7E和0x80-0xFE。
  低字节是0x40-0x7E的GBK字符有一定特殊性,因为这些字符占用了ASCII码的位置,这样会给一些系统带来麻烦。
  有些系统中用0x40-0x7E中的字符(如“|”)做特殊符号,在定位这些符号时又没有判断这些符号是不是属于某个 GBK字符的低字节,这样就会造成错误判断。在支持GB2312的环境下就不存在这个问题。需要注意的是支持GBK的环境中小于0x80的某个字节未必就 是ASCII符号;另外就是最好选用小于0×40的ASCII符号做一些特殊符号,这样就可以快速定位,且不用担心是某个汉字的另一半。Big5编码中也存在相应问题。
  CP936和GBK的有些许差别,绝大多数情况下可以把CP936当作GBK的别名。
sarrow
帖子: 403
注册时间: 2007-10-27 1:04

Re: gvim下euc-cn与cp936编码的异同

#3

帖子 sarrow » 2011-12-19 19:50

晕,我需要在ubuntu和windows两个世界混,这个文本编码,选哪一个好点?

按我搜到的说法,貌似:

cp936 > euc-cn
头像
lilydjwg
论坛版主
帖子: 4258
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: gvim下euc-cn与cp936编码的异同

#4

帖子 lilydjwg » 2011-12-19 21:16

如果不用 UTF-8,建议使用 cp936 (可能是 GBK 或者 GB18030)。euc-cn 应该只有 GB2312 部分。

参考:
* https://en.wikipedia.org/wiki/EUC-CN#EUC-CN
* https://en.wikipedia.org/wiki/Code_page_936

另外,建议使用 UTF-8。如果你觉得浪费存储空间的话,可以 gzip 一下。不过,你的磁盘快用尽了吗?
sarrow
帖子: 403
注册时间: 2007-10-27 1:04

Re: gvim下euc-cn与cp936编码的异同

#5

帖子 sarrow » 2011-12-19 21:49

lilydjwg 写了:如果不用 UTF-8,建议使用 cp936 (可能是 GBK 或者 GB18030)。euc-cn 应该只有 GB2312 部分。

参考:
* https://en.wikipedia.org/wiki/EUC-CN#EUC-CN
* https://en.wikipedia.org/wiki/Code_page_936

另外,建议使用 UTF-8。如果你觉得浪费存储空间的话,可以 gzip 一下。不过,你的磁盘快用尽了吗?
你好,小狐狸。很高兴又看到你;很遗憾你又碰到我了。

你有什么办法,固定写txt档时的编码吗?我希望cp936作为基本;utf8作为当前无法保存时
候的补充。另外,有什么插件(vim),或者脚本(非vim)能检查“最可适”编码吗?

保存文本的时候,老是会遇到这样的问题——“重新设定fenc,置空”。我希望能尽可能自
动化一点。

还有,vim能检查非法的utf8字符——有快捷键的,好像是8g8。

有检查非法的cp936字符的快捷键吗?
头像
Fermat618
帖子: 728
注册时间: 2008-12-28 16:01

Re: gvim下euc-cn与cp936编码的异同

#6

帖子 Fermat618 » 2011-12-20 0:52

如果你真的在乎文本文本所占的那一丁点硬盘的话,vim 对 .gz 等压缩文件可以在打开时自动解压,保存时自动压缩。

用GB2312保存的时候不出问题那是运气相当好。GBK 中文方面好一点,但想放个音标或者是外国佬名字就会出问题。
想自动清除fenc也简单, 用个 try catch 就好了
[vim]
try
w
catch /E513/
set fenc=
w
endtry
[/vim]
放到个函数里面,再做条自定义命令,以后用那条命令来执行保存。

我不设fileencoding的,默认utf8保存,不会出你的问题。
爱因斯坦会弹钢琴
爱因斯坦会拉小提琴
爱因斯坦会骑自行车
头像
lilydjwg
论坛版主
帖子: 4258
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: gvim下euc-cn与cp936编码的异同

#7

帖子 lilydjwg » 2011-12-20 1:27

sarrow 写了: 你好,小狐狸。很高兴又看到你;很遗憾你又碰到我了。

你有什么办法,固定写txt档时的编码吗?我希望cp936作为基本;utf8作为当前无法保存时
候的补充。另外,有什么插件(vim),或者脚本(非vim)能检查“最可适”编码吗?

保存文本的时候,老是会遇到这样的问题——“重新设定fenc,置空”。我希望能尽可能自
动化一点。

还有,vim能检查非法的utf8字符——有快捷键的,好像是8g8。

有检查非法的cp936字符的快捷键吗?
前边一个需求 Fermat 已经说了,后面一个嘛,你可以用 iconv 或者 Python 来搞定。

最后:表叫人家小狐狸啦!
sarrow
帖子: 403
注册时间: 2007-10-27 1:04

Re: gvim下euc-cn与cp936编码的异同

#8

帖子 sarrow » 2011-12-20 8:33

多谢六楼——原来还有try-catch这对宝贝。都把他们忘记了。

不过,你这样弄,貌似要改变操作习惯——你也这样说了。
如果你真的在乎文本文本所占的那一丁点硬盘的话,vim 对 .gz 等压缩文件可以在打开时自动解压,保存时自动压缩。
都说了,两原因:

1. 对纯中文,白费了一半的空间;
2. 我需要在windows下面混。而windows下面的东西,往往对utf8这套国际化编码方案支持
不太好。
我不设fileencoding的,默认utf8保存,不会出你的问题。
奇怪了,虽然我设置了fileencoding,但那个好像只与解码选择编码优先有关,和用哪种编
码写入无关!

而我的配置文件里面,压根就没有带euc-cn这个词,搜索也搜不到——不知道为啥有这种行
为的。自动用euc-cn来保存我的文件(说法不确切,是:new的时候,fenc就成euc-cn了)


----------------------------------------------------------------------
最后:表叫人家小狐狸啦!
那叫“老”狐狸、“大”狐狸?不会是“火”狐狸吧?
头像
Fermat618
帖子: 728
注册时间: 2008-12-28 16:01

Re: gvim下euc-cn与cp936编码的异同

#9

帖子 Fermat618 » 2011-12-20 10:02

sarrow 写了: 都说了,两原因:
1. 对纯中文,白费了一半的空间;
2. 我需要在windows下面混。而windows下面的东西,往往对utf8这套国际化编码方案支持
不太好。
windows内部也是用的unicode. 到现在还对utf-8支持还不好的软件,那就说不过去了。
像很多人程序中写路径坚持用反斜线(\)来分隔一样,这很可能是老印象了,实际上,
windows早支持用斜线(/)了。

以前硬盘容量以MB来计的时候,这些空间可能还比较明显,现在硬盘都是以TB来计的,
这些空间真算不得啥了。列个数据,一个长篇小说可能达到几MB多的大小,相比之下随便
一个电影就要上GB。比起GBK可能带来的不便来说,它节省的那一点点空间在现在很不值了。

当然,上面这些只是我的观点。如果你的文件里面真的很确定只含中文,并且使用环境也
非常封闭,都是把GBK当默认编码的环境,不用担心GBK没有被正确识别或者支持所造成的
乱码,我说的utf-8的那些好处你可能也用不着了,那你用GBK也挺好。
奇怪了,虽然我设置了fileencoding,但那个好像只与解码选择编码优先有关,和用哪种编
码写入无关!
那个是 fileencodings, 最后有个s, 与不带s的是两个不同的选项。不带s的就是指定写入
时的编码的。打开已存在文件时会根据fileencodings来一个一个地试文件编码,并把
试中的那个作为fileencoding.
而我的配置文件里面,压根就没有带euc-cn这个词,搜索也搜不到——不知道为啥有这种行
为的。自动用euc-cn来保存我的文件(说法不确切,是:new的时候,fenc就成euc-cn了)
编码名字有别名的
:help encoding-values
找到如下行

代码: 全选

Several aliases can be used, they are translated to one of the names above.     
An incomplete list:                                                             
                                                                                
1   ansi        same as latin1 (obsolete, for backward compatibility)           
2   japan       Japanese: on Unix "euc-jp", on MS-Windows cp932                 
2   korea       Korean: on Unix "euc-kr", on MS-Windows cp949                   
2   prc         simplified Chinese: on Unix "euc-cn", on MS-Windows cp936       
2   chinese     same as "prc"
爱因斯坦会弹钢琴
爱因斯坦会拉小提琴
爱因斯坦会骑自行车
sarrow
帖子: 403
注册时间: 2007-10-27 1:04

Re: gvim下euc-cn与cp936编码的异同

#10

帖子 sarrow » 2011-12-20 11:03

to Fermat618, 我写错了。我说的fencoding,指的就是fencodings。少敲了一个s。

我的fencodings设置用的是网上常用的那种,先判读bom,然后utf8,然后cp936,然后没了。

至于:h encoding-values

这个东西,也知道了。

就是我的那个问题,还是没有较好的解决。

我弄了一个au

autocmd WriteCmdPre * if &enc='euc-cn' | set fenc=cp936 | endif

要是w的行为能替换就好了。弄一个wrapper总觉得不舒服。
sarrow
帖子: 403
注册时间: 2007-10-27 1:04

Re: gvim下euc-cn与cp936编码的异同

#11

帖子 sarrow » 2011-12-20 11:08

要不,再帮我想一想,
输入法的问题
viewtopic.php?f=68&t=357677

该怎么解决?

有什么思路没有?可能问题出在哪些方向?

就是从终端启动的gui程序,都不能使用fcitx输入法。cli程序,则没问题。比如,shell里面启动vim,输入法照用。

另外,我的桌面环境是gnome-3.1 + cairo-dock
头像
lilydjwg
论坛版主
帖子: 4258
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: gvim下euc-cn与cp936编码的异同

#12

帖子 lilydjwg » 2011-12-20 13:37

sarrow 写了: autocmd WriteCmdPre * if &enc='euc-cn' | set fenc=cp936 | endif

要是w的行为能替换就好了。弄一个wrapper总觉得不舒服。
你把 'enc' 设成 'cp936' 不行吗?你的配置真的很奇怪耶,'euc-cn' 是 *nix 下才用的编码名。。。
sarrow 写了:
最后:表叫人家小狐狸啦!
那叫“老”狐狸、“大”狐狸?不会是“火”狐狸吧?
头像就是从维基百科「火狐」词条找到的 :em02
sarrow
帖子: 403
注册时间: 2007-10-27 1:04

Re: gvim下euc-cn与cp936编码的异同

#13

帖子 sarrow » 2011-12-20 19:27

你把 'enc' 设成 'cp936' 不行吗?你的配置真的很奇怪耶,'euc-cn' 是 *nix 下才用的编码名。。。
确实,我应该检测到new txt文件的时候,就修改fenc编码值。

另外,我的”配置真的很奇怪",是什么意思?
头像
Fermat618
帖子: 728
注册时间: 2008-12-28 16:01

Re: gvim下euc-cn与cp936编码的异同

#14

帖子 Fermat618 » 2011-12-20 21:02

lilydjwg 写了: 头像就是从维基百科「火狐」词条找到的 :em02
这舌头真长。。。。
爱因斯坦会弹钢琴
爱因斯坦会拉小提琴
爱因斯坦会骑自行车
头像
lilydjwg
论坛版主
帖子: 4258
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: gvim下euc-cn与cp936编码的异同

#15

帖子 lilydjwg » 2011-12-20 23:21

sarrow 写了:
你把 'enc' 设成 'cp936' 不行吗?你的配置真的很奇怪耶,'euc-cn' 是 *nix 下才用的编码名。。。
确实,我应该检测到new txt文件的时候,就修改fenc编码值。

另外,我的”配置真的很奇怪",是什么意思?
呃,可能我又打错字了吧。。。我是说,在 Windows 上使用 euc-cn 是一种奇怪的行为。
回复