跳转至

iconv字符集转换

一、简介

1.1 字符编码的定义与作用

字符编码(Character encoding)是指将字符集中的字符编码为指定集合中的某一对象(例如:比特模式、自然数序列、8 位组或者电脉冲),以便文本在计算机中存储或通过通信网络传递。常见的例子包括将拉丁字母表编码成摩斯电码和 ASCII,其中 ASCII 使用 7 个或 8 个二进制位进行编码,最多可以给 256 个字符分配数值。

1.2 常见字符编码格式

  • ASCII:使用 7 个或 8 个二进制位进行编码,最多可以给 256 个字符分配数值,包括字母、数字和符号。
  • Unicode:一种国际标准字符集,支持世界上几乎所有的书写系统,包括汉字、日文假名等。
  • UTF-8:Unicode 的一种变长字符编码,由 Ken Thompson 于 1992 年创建,现已标准化为 RFC 3629。UTF-8 用 1 到 6 个字节编码 Unicode 字符。
  • GB2312:中国国家标准字符集,用于简体中文。
  • GBK:在 GB2312 基础上扩展的字符集,支持更多的中文字符。
  • Big5:用于繁体中文的字符集。

二、演示功能概述

本教程教你如何用 Air724 开发板,展示在不同编码格式之间进行转换的工具和方法,包括 Unicode(小端和大端)、GB2312 和 UTF-8 等常见编码格式。

三、准备硬件环境

3.1 开发板准备

使用 EVB_Air724 开发板,如下图所示:

淘宝购买链接:Air724UG-NFM 开发板淘宝购买链接

此开发板的详细使用说明参考:Air724UG 产品手册 中的《EVB_Air724UG_AXX 开发板使用说明》,写这篇文章时最新版本的使用说明为:《EVB_Air724UG_A14 开发板使用说明》;开发板使用过程中遇到任何问题,可以直接参考这份使用说明文档。

api:https://doc.openluat.com/wiki/21?wiki_page_id=2068

3.2 数据通信线

USB 数据线一根(micro USB)。

3.3 PC 电脑

WIN7 以及以上版本的 WINDOWS 系统。

3.4 SIM 卡

中国大陆环境下,可以上网的 SIM 卡。一般来说,使用移动,电信,联通的物联网卡或者手机卡都行。

3.5 组装硬件环境

USB 数据线插入 USB 口,另一端与电脑相连,拨码开关全部拨到 ON,串口切换开关选择 UART1,USB 供电的 4V 对应开关拨至 ON 档,SIM 卡放到 SIM 卡槽中锁紧,如下图所示。

四、准备软件环境

4.1 下载调试工具

使用说明参考:Luatools 下载和详细使用

4.2 源码及固件

1.底层 core 下载

下载底层固件,并解压

链接:https://docs.openluat.com/air724ug/luatos/firmware/

如下图所示,红框的是我们要使用到的

2.本教程使用的 demo 见附件:

右键点我,另存为,下载完整压缩文件包

4.3 下载固件和脚本到开发板中

打开 Luatools,开发板上电开机,如开机成功 Luatools 会打印如下信息。

点击项目管理测试选项。

进入管理界面,如下图所示。

  • 点击选择文件,选择底层固件,我的文件放在 D:\luatOS\Air724 路径中

  • 点击增加脚本或资源文件,选择 之前下载的程序源码,如下图所示。

  • 点击下载底层和脚本,下载完成如下图所示。

五、代码示例介绍

5.1 API 说明

5.1.1 iconv.open(tocode, fromcode)

打开相应字符编码转换函数

参数

传入值类型
解释
string

释义:目标编码格式
取值:gb2312/ucs2/ucs2be/utf8
string
释义:源编码格式
取值:gb2312/ucs2/ucs2be/utf8

返回值

返回值类型
解释
userdata
编码转换函数的转换句柄,若不存在会返回 nil

例子

--unicode大端编码 转化为 utf8编码local iconv = iconv.open("utf8", "ucs2be")

5.1.2 iconv:iconv(inbuf)

字符编码转换

参数

传入值类型
解释
string

释义:待转换字符串

返回值

返回值类型
解释
number
释义:返回编码转换后的结果
取值:0 成功,-1 失败

例子

--unicode大端编码 转化为 utf8编码function ucs2beToUtf8(ucs2s)local iconv = iconv.open("utf8", "ucs2be")return iconv:iconv(ucs2s)end

5.1.3 iconv.open(tocode, fromcode)

打开相应字符编码转换函数

参数

传入值类型
解释
string

tocode 目标编码格式 gb2312/ucs2/ucs2be/utf8
string
fromcode 源编码格式 gb2312/ucs2/ucs2be/utf8
return
table cd 编码转换函数的转换句柄

例子

--unicode大端编码 转化为 utf8编码local cd = iconv.open("utf8", "ucs2be")

5.1.4 iconv:iconv(inbuf)

字符编码转换

参数

传入值类型
解释
string

inbuf 输入字符串 例如:ucs2s
return
number result 返回编码转换后的结果 0 成功,-1 失败

例子

--unicode大端编码 转化为 utf8编码function ucs2beToUtf8(ucs2s)local cd = iconv.open("utf8", "ucs2be")return cd:iconv(ucs2s)end

5.1.5 iconv.close(cd)

关闭字符编码转换

参数

传入值类型
解释
string

cd iconv.open 返回的句柄
return

返回值

例子

--关闭字符编码转换local cd = iconv.open("utf8", "ucs2be")iconv.close(cd)

5.2 testJson.lua 代码

系统启动后调用对应的函数进行各种转码测试。

  • testucs2ToGb2312(string.fromHex("1162")) --
  • testgb2312ToUcs2(string.fromHex("CED2")) --
  • testucs2beToGb2312(string.fromHex("6211")) --
  • testgb2312ToUcs2be(string.fromHex("CED2"))
  • testucs2ToUtf8(string.fromHex("1162"))
  • testutf8ToGb2312(string.fromHex("E68891")) --
  • testgb2312ToUtf8(string.fromHex("CED2"))
--- 模块功能:iconv功能测试.
-- @author openLuat
-- @module
-- @license MIT
-- @copyright openLuat
-- @release 2018.03.28

--- unicode小端编码 转化为 gb2312编码
-- @string ucs2s unicode小端编码数据
-- @return string data,gb2312编码数据
-- @usage local data = common.ucs2ToGb2312(ucs2s)
function ucs2ToGb2312(ucs2s)
    local cd = iconv.open("gb2312", "ucs2")
    return cd:iconv(ucs2s)
end

--- gb2312编码 转化为 unicode小端编码
-- @string gb2312s gb2312编码数据
-- @return string data,unicode小端编码数据
-- @usage local data = common.gb2312ToUcs2(gb2312s)
function gb2312ToUcs2(gb2312s)
    local cd = iconv.open("ucs2", "gb2312")
    return cd:iconv(gb2312s)
end

--- unicode大端编码 转化为 gb2312编码
-- @string ucs2s unicode大端编码数据
-- @return string data,gb2312编码数据
-- @usage data = common.ucs2beToGb2312(ucs2s)
function ucs2beToGb2312(ucs2s)
    local cd = iconv.open("gb2312", "ucs2be")
    return cd:iconv(ucs2s)
end

--- gb2312编码 转化为 unicode大端编码
-- @string gb2312s gb2312编码数据
-- @return string data,unicode大端编码数据
-- @usage local data = common.gb2312ToUcs2be(gb2312s)
function gb2312ToUcs2be(gb2312s)
    local cd = iconv.open("ucs2be", "gb2312")
    return cd:iconv(gb2312s)
end

--- unicode小端编码 转化为 utf8编码
-- @string ucs2s unicode小端编码数据
-- @return string data,utf8编码数据
-- @usage data = common.ucs2ToUtf8(ucs2s)
function ucs2ToUtf8(ucs2s)
    local cd = iconv.open("utf8", "ucs2")
    return cd:iconv(ucs2s)
end

--- utf8编码 转化为 unicode小端编码
-- @string utf8s utf8编码数据
-- @return string data,unicode小端编码数据
-- @usage local data = common.utf8ToUcs2(utf8s)
function utf8ToUcs2(utf8s)
    local cd = iconv.open("ucs2", "utf8")
    return cd:iconv(utf8s)
end

--- unicode大端编码 转化为 utf8编码
-- @string ucs2s unicode大端编码数据
-- @return string data,utf8编码数据
-- @usage data = common.ucs2beToUtf8(ucs2s)
function ucs2beToUtf8(ucs2s)
    local cd = iconv.open("utf8", "ucs2be")
    return cd:iconv(ucs2s)
end

--- utf8编码 转化为 unicode大端编码
-- @string utf8s utf8编码数据
-- @return string data,unicode大端编码数据
-- @usage local data = common.utf8ToUcs2be(utf8s)
function utf8ToUcs2be(utf8s)
    local cd = iconv.open("ucs2be", "utf8")
    return cd:iconv(utf8s)
end

--- utf8编码 转化为 gb2312编码
-- @string utf8s utf8编码数据
-- @return string data,gb2312编码数据
-- @usage local data = common.utf8ToGb2312(utf8s)
function utf8ToGb2312(utf8s)
    local cd = iconv.open("ucs2", "utf8")
    local ucs2s = cd:iconv(utf8s)
    cd = iconv.open("gb2312", "ucs2")
    return cd:iconv(ucs2s)
end

--- gb2312编码 转化为 utf8编码
-- @string gb2312s gb2312编码数据
-- @return string data,utf8编码数据
-- @usage local data = common.gb2312ToUtf8(gb2312s)
function gb2312ToUtf8(gb2312s)
    local cd = iconv.open("ucs2", "gb2312")
    local ucs2s = cd:iconv(gb2312s)
    cd = iconv.open("utf8", "ucs2")
    return cd:iconv(ucs2s)
end

--------------------------------------------------------------------------------------------------------
--[[
函数名:ucs2ToGb2312
功能  :unicode小端编码 转化为 gb2312编码,并打印出gd2312编码数据
参数  :
        ucs2s:unicode小端编码数据,注意输入参数的字节数
返回值:
]]
local function testucs2ToGb2312(ucs2s)
    print("ucs2ToGb2312")
    local gd2312num = ucs2ToGb2312(ucs2s)--调用的是common.ucs2ToGb2312,返回的是编码所对应的字符串
    --print("gb2312  code:",gd2312num)
    print("gb2312  code:",string.toHex(gd2312num))
end

--[[
函数名:gb2312ToUcs2
功能  :gb2312编码 转化为 unicode十六进制小端编码数据并打印
参数  :
        gb2312s:gb2312编码数据,注意输入参数的字节数
返回值:
]]
local function testgb2312ToUcs2(gd2312num)
    print("gb2312ToUcs2")
    local ucs2num = gb2312ToUcs2(gd2312num)
    print("unicode little-endian code:" .. string.toHex(ucs2num)) -- 要将二进制转换为十六进制,否则无法输出
end

--[[
函数名:ucs2beToGb2312
功能  :unicode大端编码 转化为 gb2312编码,并打印出gb2312编码数据,
大端编码数据是与小端编码数据位置调换
参数  :
        ucs2s:unicode大端编码数据,注意输入参数的字节数
返回值:
]]
local function testucs2beToGb2312(ucs2s)
    print("ucs2beToGb2312")
    local gd2312num = ucs2beToGb2312(ucs2s) -- 转化后的数据直接变成字符可以直接输出
    print("gd2312 code :" .. string.toHex(gd2312num))
end

--[[
函数名:gb2312ToUcs2be
功能  :gb2312编码 转化为 unicode大端编码,并打印出unicode大端编码
参数  :
        gb2312s:gb2312编码数据,注意输入参数的字节数
返回值:unicode大端编码数据
]]
function testgb2312ToUcs2be(gb2312s)
    print("gb2312ToUcs2be")
    local ucs2benum = gb2312ToUcs2be(gb2312s)
    print("unicode big-endian code :" .. string.toHex(ucs2benum))
end

--[[
函数名:ucs2ToUtf8
功能  :unicode小端编码 转化为 utf8编码,并打印出utf8十六进制编码数据
参数  :
        ucs2s:unicode小端编码数据,注意输入参数的字节数
返回值:
]]
local function testucs2ToUtf8(usc2)
    print("ucs2ToUtf8")
    local utf8num = ucs2ToUtf8(usc2)
    print("utf8  code:" .. string.toHex(utf8num))

end

--[[
函数名:utf8ToGb2312
功能  :utf8编码 转化为 gb2312编码,并打印出gb2312编码数据
参数  :
        utf8s:utf8编码数据,注意输入参数的字节数
返回值:
]]
local function testutf8ToGb2312(utf8s)
    print("utf8ToGb2312")
    local gb2312num = utf8ToGb2312(utf8s)
    print("gd2312 code:" .. string.toHex(gb2312num))

end

--[[
函数名:utf8ToGb2312
功能  :utf8编码 转化为 gb2312编码,并打印出gb2312编码数据
参数  :
        utf8s:utf8编码数据,注意输入参数的字节数
返回值:
]]
local function testgb2312ToUtf8(gb2312s)
    print("gb2312ToUtf8")
    local utf8s = gb2312ToUtf8(gb2312s)
    print("utf8s code:" .. utf8s)

end

sys.taskInit(function()
    while 1 do
        sys.wait(5000)
        testucs2ToGb2312(string.fromHex("1162")) -- "1162"是"我"字的ucs2编码,这里调用了string.fromHex将参数转化为二进制,也就是两个字节。
        testgb2312ToUcs2(string.fromHex("CED2")) -- "CED2"是"我"字的gb22312编码
        testucs2beToGb2312(string.fromHex("6211")) -- "6211"是"我"字的ucs2be编码
        testgb2312ToUcs2be(string.fromHex("CED2"))
        testucs2ToUtf8(string.fromHex("1162"))
        testutf8ToGb2312(string.fromHex("E68891")) -- "E68891"是"我"字的utf8编码
        testgb2312ToUtf8(string.fromHex("CED2"))
    end
end)

5.3 main.lua 代码

本代码为主程序脚本,系统启动后首先会对 4G 网络进行配置,等待网络连接成功,然后加载测试模块。

六、开机调试

6.1 开发板开机

连接好硬件并下载固件后,启动 Luatools 软件,系统运行信息将显示在界面中。红框中为开发板连接到 PC 机后正常打印的信息,如下图所示。

6.2 功能调试

进行转码,输出对应的打印日志。

七、总结

本文演示通过对不同字符编码格式的介绍和实际转换操作,使得大家更加了解了字符编码在计算机通信中的重要性,以及如何在不同编码格式之间进行转换。演示中使用的工具和硬件环境为 Air724 开发板和 Lua 编程语言,通过实际编码转换的例子,展示了字符编码转换在实际应用中的重要性。

在演示中,我们介绍了 Unicode(小端和大端)、GB2312 和 UTF-8 等常见编码格式,并展示了如何在 Lua 中使用 iconv 库进行编码转换。通过这个演示,大家可以了解到不同编码格式之间的差异,以及在不同场景下如何选择合适的编码格式。

给读者的话

本篇文章由杨超开发;

本篇文章描述的内容,如果有错误、细节缺失、细节不清晰或者其他任何问题,总之就是无法解决您遇到的问题;

请登录合宙技术交流论坛,点击文档找错赢奖金-Air724UG-LuatOS-软件指南-通用工具库-iconv字符集转换

用截图标注+文字描述的方式跟帖回复,记录清楚您发现的问题;

我们会迅速核实并且修改文档;

同时也会为您累计找错积分,您还可能赢取月度找错奖金!