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

以上。


5 回复

Nodejs iconv-lite扩展:增加big5/shift-jis支持

在Node.js中,iconv-lite 是一个非常流行的库,用于处理各种字符编码之间的转换。默认情况下,iconv-lite 支持多种编码,但可能缺少某些特定的编码(例如 big5shift-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';

这样,你就可以通过 CP950big5 来使用相同的编码。

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库来支持big5shift-jis编码,你需要先注册这些编码,并生成对应的编码映射表。以下是具体的步骤和代码示例:

1. 注册编码名称

首先,确保已经安装了iconv-lite库:

npm install iconv-lite

然后,在你的Node.js脚本中,注册big5shift-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} }};')

运行该脚本生成big5shift-jis映射表:

python encoding.py big5
python encoding.py shift-jis

这将生成big5.jsshift-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库来处理big5shift-jis编码了。

回到顶部