Nodejs iconv-lite扩展:增加big5/shift-jis支持
Nodejs iconv-lite扩展:增加big5/shift-jis支持
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)的编码。
以上。
Nodejs iconv-lite扩展:增加big5/shift-jis支持
在Node.js中,iconv-lite
是一个非常流行的库,用于处理各种字符编码之间的转换。默认情况下,iconv-lite
支持多种编码,但可能缺少某些特定的编码(例如 big5
和 shift-jis
)。本文将介绍如何通过扩展 iconv-lite
来添加对这些编码的支持。
1. 注册编码名称
首先,我们需要注册新的编码名称,以便 iconv-lite
能够识别它们。例如,对于 big5
编码:
var iconv = require('iconv-lite');
iconv.encodings['big5'] = { type: 'table', table: mappingTable };
这里,big5
是我们要添加的新编码名称,type
设置为 'table'
表示我们使用的是映射表。mappingTable
是一个对象,包含了从 big5
编码到 Unicode 的映射关系。
2. 注册别名(可选)
为了方便使用,可以为新编码注册别名。例如,big5
有时也被称为 CP950
:
iconv.encodings['CP950'] = 'big5';
这样,你就可以通过 CP950
或 big5
来使用相同的编码。
3. 生成编码对照表
接下来,我们需要生成 big5
编码与 Unicode 字符之间的对照表。这可以通过遍历 Unicode 字符并尝试将其转换为 big5
编码来完成。以下是一个 Python 脚本示例,用于生成 big5
编码表:
import sys
def generate_encoding_table(encoding):
charset = {}
n = 0xFF + 1 # Skip 0x00-0xFF
while n < 0xFFFD:
try:
u = chr(n)
c = u.encode(encoding)
if len(c) == 2:
charset[int(c.hex(), 16)] = n
except UnicodeEncodeError:
pass
except LookupError as e:
print(e)
sys.exit(1)
except Exception as e:
print(f"Unexpected error: {e}")
raise
finally:
n += 1
return charset
if __name__ == "__main__":
encoding = sys.argv[1]
charset = generate_encoding_table(encoding)
with open(f"{encoding}.js", "w") as f:
f.write(f"module.exports = {charset};")
运行此脚本:
python encoding.py big5
生成的 big5.js
文件将包含 big5
编码与 Unicode 字符的映射关系。
使用自定义编码
最后,在你的 Node.js 项目中,你可以像这样使用自定义的 big5
编码:
var iconv = require('iconv-lite');
require('./big5.js'); // 加载自定义编码表
var testStr = '繓騚做僰譺abc';
var testBuf = new Buffer('F077F3B4B0B5E0FBF650616263', 'hex');
var resultBuf = iconv.encode(testStr, 'big5');
var resultStr = iconv.decode(testBuf, 'big5');
console.log(resultStr); // 输出: 繓騚做僰譺abc
console.log(resultBuf.toString('hex')); // 输出: F077F3B4B0B5E0FBF650616263
这样,你就可以在 Node.js 中使用 big5
编码了。类似的方法也可以用来添加对 shift-jis
或其他编码的支持。
希望这篇教程对你有所帮助!
这个好
技术帖,非常不错,赞!
收藏
为了在Node.js中使用iconv-lite
库来支持big5
和shift-jis
编码,你需要先注册这些编码,并生成对应的编码映射表。以下是具体的步骤和代码示例:
1. 注册编码名称
首先,确保已经安装了iconv-lite
库:
npm install iconv-lite
然后,在你的Node.js脚本中,注册big5
和shift-jis
编码:
const iconv = require('iconv-lite');
// 注册big5编码
iconv.encodings['big5'] = { type: 'table', table: require('./big5.js').mappingTable };
// 注册big5别名CP950
iconv.encodings['CP950'] = 'big5';
// 注册shift-jis编码
iconv.encodings['shift-jis'] = { type: 'table', table: require('./shift-jis.js').mappingTable };
2. 生成编码映射表
你可以使用Python脚本来生成这些映射表。以下是一个生成big5
映射表的Python脚本示例:
import sys
def generate_encoding_mapping(encoding):
charset = {}
n = 0xFF + 1 # Skip 0x00-0xFF
while n < 0xFFFF:
try:
u = chr(n)
c = u.encode(encoding)
# Output 2 bytes character, skip others
if len(c) == 2:
charset[int(c.hex(), 16)] = n
except UnicodeEncodeError:
pass
except Exception as e:
print(e)
sys.exit(1)
finally:
n += 1
return charset
if __name__ == '__main__':
encoding = sys.argv[1]
mapping = generate_encoding_mapping(encoding)
with open(f'{encoding}.js', 'w') as f:
f.write(f'module.exports = {{ "mappingTable": {mapping} }};')
运行该脚本生成big5
和shift-jis
映射表:
python encoding.py big5
python encoding.py shift-jis
这将生成big5.js
和shift-jis.js
文件,这些文件可以被引入到你的Node.js脚本中。
3. 使用编码
现在,你可以使用这些编码进行字符串和缓冲区之间的转换:
const iconv = require('iconv-lite');
require('./big5.js');
require('./shift-jis.js');
const testStr = '繓騚做僰譺abc';
const testBuf = new Buffer('F077F3B4B0B5E0FBF650616263', 'hex');
const resultBuf = iconv.encode(testStr, 'big5');
const resultStr = iconv.decode(testBuf, 'shift-jis');
console.log(resultStr); // 输出原始字符串
console.log(resultBuf); // 输出缓冲区
这样,你就可以在Node.js中使用iconv-lite
库来处理big5
和shift-jis
编码了。