iconv-lite扩展:增加big5/shift-jis支持
发布于 3 年前 作者 shiedman 5656 次浏览

iconv-lite的cjk编码只支持gbk,如何使之支持更多的编码呢。 1.注册编码名称

var iconv=require('iconv-lite');
iconv.encodings['big5']={type:'table',table:mappingTable};

2.注册别名(可选)

//big5也叫CP950 (严格来说big5是CP950子集)
iconv.encodings['CP950']='big5';

3.生成编码对照表

mappingTable= {
    //big5 code ==> unicode code
    0xA7B8:0x5B5B,//孛
    0xA7B9:0x5B8C,//完
    //more code here...
}

要找出big5中所有字符与unicode字符的对应关系,看似麻烦其实不然,网上有现成的编码表,格式稍作转换即可。或者象我一样通过其他工具遍历unicode所有字符(仅限双字节),并尝试转换为big5,若成功就输出到编码表。以python为例:

encoding=sys.argv[1]
charset={}
n=0xff+1#skip 0x00-0xFF
while n<0xfffd:
    try:
        u=unichr(n)
        c=u.encode(encoding)
        #output 2 bytes char, skip others
        if len(c)==2:
            charset[int(c.encode('hex'),16)]=n
    except UnicodeEncodeError:
       pass 
    except LookupError as e:
        print e.message
        sys.exit(1)
    except:
        print 'Unexpected error:', sys.exc_info()[0]
        raise
    finally:
        n+=1

完整版代码链接:https://gist.github.com/shiedman/5477190

python encoding.py big5, 自动生成编码表big5.js和测试big5Test.js big5.js: https://gist.github.com/shiedman/5477198 使用方法:在iconv=require('iconv-lite')后,加入require('./big5.js') cat big5Test.js

var iconv=require('iconv-lite'),
    assert=require('assert');
require('./big5.js');

var testStr='繓騚做僰譺abc',
    testBuf=new Buffer('F077F3B4B0B5E0FBF650616263','hex');

var resultBuf=iconv.encode(testStr,'big5'),
    resultStr=iconv.decode(testBuf,'big5');

assert.strictEqual(testStr,resultStr);
assert.strictEqual(testBuf.toString('hex'),resultBuf.toString('hex'));
console.log('test passed');

类似可生成日文shift-jis编码表:python encoding.py shift-jis, 甚至可生成棒子文euc-kr。不过限于iconv-lite的实现方式,没法完美支持存在三字节字符(euc-jp)/四字节字符(gb18030)的编码。

以上。

3 回复

技术帖,非常不错,赞!

回到顶部