咸菜

啃咸菜 品生活

vim转换文本文件字符编码

用VLCplayer手机上看电影,发现.srt的字幕文件总是显示乱码,类似于将feb鹹菜de漢字幕乱码成febûy²Ëde<9d>h×ÖÄ»,尝试更改过编码选项也无济于事,干脆直接选项定位为utf8,然后想从文本文件下手转换编码,于是又了解到一点新知识,遂记录在此。

vim转换文本文件编码

未设置.vimrc的vim,打开字幕那个.srt依然显示乱码,这时是没法转换的,需要先能够正确显示文本内容才行,也就是需找到文本是采用的那种编码。:edit ++encoding=gbk后文本正常,确定是gbk编码,此时具备转换条件,转换文件也很简单::write ++encoding=utf8

复习一下vim几个关于编码的设置

还想再记几个参数,直接放上.vimrc吧

set nocompatible
set encoding=utf-8
set fileencoding=utf-8
set fileencodings=ucs-bom,utf-8,gb18030,latin1
set fileformat=unix
set fileformats=unix,dos
set nonumber
set showcmd
set autoindent
set ruler
set showmatch
set t_Co=256
set tabstop=2
set shiftwidth=2
filetype indent on
syntax on

不得不再了解一下code page

在转换字幕.srt文件时,如前述:set ++encoding=gbk后,文本可以正确显示,再:set encoding却返回encoding=cp936,这个cp936就是code page。

code page就是针对一定范围字符的编码页表。其可内置于操作系统(包括bios)来显示文字(包括非英文字母),不同操作系统间code page并不一定一致。code page编号以区别,有OEM用的、Windows用的,也有两者通用、共用的,比如cp936(简体gbk)。但发现vim却不把gb18030显示为cp54936,不明所以。

GB18030

7bit编码表ascii显示不了汉字,1980年设计了用于简体的gb2312和用于繁体的big5。gb2312用两组数,第一组数“区”,第二组数“位”,就是区位码。其与ascii编码冲突,作为code page时,在区位码高低字节上分别+0xa0(比如“啊”区位码1601即0x10,0x01,code page码b0a1,即0xb0,0xa1),存储格式big endian(BE,大端字节序,高位字节在前)。gb2312字符少,1995年gbk(汉字扩展规范)扩充了字符,2000年gb18030取代gbk,不仅收录汉字,还包括少数民族文字。

从ascii、gb2312、gbk到gb18030,字符编码是向前兼容的,同一个字符总是保持相同的编码(so,用错code page时汉字都乱码而大部分英文字母幸存),所以用gb18030可以正确解读以gbk编码的文本。gb集都是DBCS(双字节字符集),高字节最高位为1(以区别于ascii)。因为gb集低字节最高位也可能为1,所以需避免拆开DBCS的双字节,解析DBCS字节流时,只要遇到最高位为1(就当是双字节高字节开始了),就将两个字节认为DBCS编码(而不在意低字节最高位为0为1)。