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)的编码。
以上。