跳转至

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固件支持列表

Air700ECH/Air780EHM/EHV/EGH/EGG/EHU/EHN固件支持列表

Air8000系列所有型号固件支持列表

Air8101系列所有型号固件支持列表

Air1601/Air1602固件支持列表