30 iconv-字符编码转换
孟伟
一、概述
1.1 功能说明
iconv 模块提供字符编码转换功能,支持在不同字符编码格式之间进行转换,如 gb2312/ucs2/ucs2be/utf8。
1.2 主要功能
- 支持打开不同编码格式的转换句柄
- 提供编码之间的字符转换能力
- 支持关闭转换句柄以释放资源
1.3 应用场景
- 处理不同编码格式的文本数据
- 与外部系统进行编码兼容的数据交换
- 多语言环境下的文本处理
二、核心示例
1、核心示例是指:使用本库文件提供的核心 API,开发的基础业务逻辑的演示代码;
2、核心示例的作用是:帮助开发者快速理解如何使用本库,所以核心示例的逻辑都比较简单;
3、更加完整和详细的 demo,请参考 LuatOS 仓库 中各个产品目录下的 demo/iconv
-- Unicode大端编码转换为UTF-8编码
function ucs2beToUtf8(ucs2s)
local ic = iconv.open("utf8", "ucs2be")
if not ic then
log.info("iconv", "打开转换句柄失败")
return nil
end
local result = ic:iconv(ucs2s)
iconv.close(ic)
return result
end
-- 实际使用示例
local unicodeStr = "\x00\x41\x00\x42" -- "AB"的UCS2BE编码
local utf8Str = ucs2beToUtf8(unicodeStr)
if utf8Str then
log.info("iconv", "转换结果:", utf8Str)
end
三、常量详解
核心库常量,顾名思义是由合宙 LuatOS 内核固件中定义的、不可重新赋值或修改的固定值,在脚本代码中不需要声明,可直接调用;
每个常量对应的常量取值仅做日志打印时查询使用,不要将这个常量取值用做具体的业务逻辑判断,因为LuatOS内核固件可能会变更每个常量对应的常量取值;
如果用做具体的业务逻辑判断,一旦常量取值发生改变,业务逻辑就会出错;
iconv 核心库没有常量。
四、函数详解
4.1 iconv.open(tocode, fromcode)
功能
打开相应字符编码转换函数
参数
tocode
参数含义:目标编码格式;
数据类型:string;
取值范围:"gb2312"/"ucs2"/"ucs2be"/"utf8";
是否必选:必选;
注意事项:暂无;
参数示例:"utf8"
fromcode
参数含义:源编码格式;
数据类型:string;
取值范围:"gb2312"/"ucs2"/"ucs2be"/"utf8";
是否必选:必选;
注意事项:暂无;
参数示例:"ucs2be"
返回值
local ic = iconv.open(tocode, fromcode)
有一个返回值 ic
ic
含义说明:成功时返回一个userdata类型的iconv客户端实例对象,该实例对象可用于后续的iconv编码转换操作;
失败时返回nil;
实例对象名称并不是固定的ic,可自定义;
数据类型:userdata;
取值范围:成功返回有效的句柄,失败返回nil;
注意事项:暂无;
已支持的字符转换,如下表格所示:
| 参数 | tocode | fromcode | 示例 |
|---|---|---|---|
| gb2312编码 转化为 unicode小端编码 | "ucs2" | "gb2312" | iconv.open("ucs2", "gb2312") |
| gb2312编码 转化为 unicode大端编码 | "ucs2be" | "gb2312" | iconv.open("ucs2be", "gb2312") |
| unicode小端编码 转化为 gb2312编码 | "gb2312" | "ucs2" | iconv.open("gb2312", "ucs2") |
| unicode大端编码 转化为 gb2312编码 | "gb2312" | "ucs2be" | iconv.open("gb2312", "ucs2be") |
| unicode小端编码 转化为 utf8编码 | "utf8" | "ucs2" | iconv.open("utf8", "ucs2") |
| unicode大端编码 转化为 utf8编码 | "utf8" | "ucs2be" | iconv.open("utf8", "ucs2be") |
| utf8编码 转化为 unicode小端编码 | "ucs2" | "utf8" | iconv.open("ucs2", "utf8") |
| utf8编码 转化为 unicode大端编码 | "ucs2be" | "utf8" | iconv.open("ucs2be", "utf8") |
示例
-- Unicode大端编码 转化为 utf8编码
local ic = iconv.open("utf8", "ucs2be")
4.2 ic:iconv(inbuf)
功能
字符编码转换,
注意事项
ic 是由 iconv.open(tocode, fromcode)所返回的实例对象。
参数
inbuf
参数含义:待转换字符串;
数据类型:string;
取值范围:任意字符串;
是否必选:必选;
注意事项:暂无;
参数示例:"\x00\x41\x00\x42"
返回值
local result = ic:iconv(inbuf)
有一个返回值 result
result
含义说明:返回编码转换后的结果;
数据类型:string;
取值范围:成功返回转换后的字符串,失败返回nil;
注意事项:暂无;
示例
-- Unicode大端编码 转化为 utf8编码_
function ucs2beToUtf8(ucs2s)
local ic = iconv.open("utf8", "ucs2be")
return ic:iconv(ucs2s)
end
五、产品支持说明
不同产品的LuatOS固件,对iconv核心库的支持情况如下:
1、Air780EX2/Air700ECP/Air780EPM/Air780EGP 所有固件都支持;
2、Air700ECH/Air780EHM/EHV/EGH/EGG/EHU/EHN/Air8000系列 所有固件都支持;
3、Air8101系列 101号、106号固件支持;
4、Air1601 / Air1602 都支持;
各产品固件支持核心库列表详细说明参考下面链接:
Air780EX2/Air700ECP/Air780EPM/Air780EGP固件支持列表