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:用于繁体中文的字符集。
1.3 字符编码格式的使用场景和注意事项
在使用不同的字符编码格式时,需要注意以下几点:
- 兼容性:确保发送端和接收端使用相同的字符编码,避免乱码问题。
- 转换规则:了解 Unicode 和 UTF-8 之间的转换规则,确保正确编码和解码。
- 应用场景:根据具体应用场景选择合适的字符编码格式,例如 Web 开发中常用 UTF-8。
二、演示功能概述
本文演示主要展示了在不同编码格式之间进行转换的工具和方法,包括 Unicode(小端和大端)、GB2312 和 UTF-8 等常见编码格式。通过使用 Lua 语言和 Air780EP 核心板,实现了以下功能:
- Unicode 小端编码与 GB2312 编码之间的转换。
- Unicode 大端编码与 GB2312 编码之间的转换。
- Unicode 小端编码与 UTF-8 编码之间的转换。
- Unicode 大端编码与 UTF-8 编码之间的转换。
- GB2312 编码与 UTF-8 编码之间的转换。
此外,还提供了一个简单的 Lua 脚本,用于在不同编码之间进行转换测试,并打印出转换后的编码数据。通过这个演示,大家可以了解不同编码格式之间的转换规则,并在实际应用中进行编码转换。
三、准备硬件环境
参考:硬件环境清单第二章节内容,准备以及组装好硬件环境。
四、软件环境
“凡事预则立,不预则废。”在详细阐述本功能示例之前,我们需先精心筹备好以下软件环境。
1. Luatools工具;
2. 内核固件文件(底层core固件文件):LuatOS-SoC_V2002_Air780EP;参考项目使用的内核固件;
3. luatos需要的脚本和资源文件
脚本和资源文件右键点我,另存为,下载完整压缩文件包
lib脚本文件:使用Luatools烧录时,勾选 添加默认lib 选项,使用默认lib脚本文件;
准备好软件环境之后,接下来查看如何烧录项目文件到Air780EP核心板,将本篇文章中演示使用的项目文件烧录到Air780EP核心板中。
五、软硬件资料
5.1 iconv 操作库介绍
需要注意,Air780EP 默认固件不带 iconv 库,需要进行云编译添加。 云编译操作指南参考:☁️ 云编译 - LuatOS 文档
5.1.1 iconv 库说明
这个库是一个用于在 Lua 中执行字符集转换的模块,称为 iconv
。它提供了多种功能,允许用户在不同的字符编码之间进行转换。
5.1.2 API 接口介绍
本教程所使用 API 接口参考:iconv - iconv 操作 - luatos@Air780EP - 合宙文档中心
六、功能验证
6.1 代码示例介绍
本文所用 Lua 代码是一个编码转换工具,主要用于在不同编码格式之间进行转换,包括 Unicode(小端和大端)、GB2312 和 UTF-8。以下是各个部分的详细介绍:
6.1.1 核心信息
PROJECT
和VERSION
变量用于标识项目的名称和版本。PRODUCT_KEY
是一个示例密钥,用户需根据实际情况进行替换。- 通过
require
引用系统库sys
和sysplus
。
6.1.2 编码转换函数
-
Unicode 小端与 GB2312 转换
-
ucs2ToGb2312(ucs2s)
:将 Unicode 小端编码转换为 GB2312 编码。 gb2312ToUcs2(gb2312s)
:将 GB2312 编码转换为 Unicode 小端编码。-
Unicode 大端与 GB2312 转换
-
ucs2beToGb2312(ucs2s)
:将 Unicode 大端编码转换为 GB2312 编码。 gb2312ToUcs2be(gb2312s)
:将 GB2312 编码转换为 Unicode 大端编码。-
Unicode 小端与 UTF-8 转换
-
ucs2ToUtf8(ucs2s)
:将 Unicode 小端编码转换为 UTF-8 编码。 utf8ToUcs2(utf8s)
:将 UTF-8 编码转换为 Unicode 小端编码。-
Unicode 大端与 UTF-8 转换
-
ucs2beToUtf8(ucs2s)
:将 Unicode 大端编码转换为 UTF-8 编码。 utf8ToUcs2be(utf8s)
:将 UTF-8 编码转换为 Unicode 大端编码。-
GB2312 与 UTF-8 转换
-
utf8ToGb2312(utf8s)
:将 UTF-8 编码转换为 GB2312 编码。 gb2312ToUtf8(gb2312s)
:将 GB2312 编码转换为 UTF-8 编码。
6.1.3 测试函数
代码中定义了一些测试函数,用于验证编码转换的正确性,并且打印出转换后的编码数据:
testucs2ToGb2312(ucs2s)
:测试 Unicode 小端到 GB2312 的转换。testgb2312ToUcs2(gb2312s)
:测试 GB2312 到 Unicode 小端的转换。testucs2beToGb2312(ucs2s)
:测试 Unicode 大端到 GB2312 的转换。testgb2312ToUcs2be(gb2312s)
:测试 GB2312 到 Unicode 大端的转换。testucs2ToUtf8(ucs2)
:测试 Unicode 小端到 UTF-8 的转换。testutf8ToGb2312(utf8s)
:测试 UTF-8 到 GB2312 的转换。testgb2312ToUtf8(gb2312s)
:测试 GB2312 到 UTF-8 的转换。
6.1.4 主循环
在主任务中,使用 sys.taskInit
创建一个协程,在协程中定义一个循环函数,不断进行编码转换测试,每隔一秒循环一次。
6.1.5 结尾
最后,通过 sys.run()
启动系统运行,确保程序按预期执行。
6.2 完整代码展示
-- LuaTools需要PROJECT和VERSION这两个信息
PROJECT = "my_test"
VERSION = "1.2"
PRODUCT_KEY = "s1uUnY6KA06ifIjcutm5oNbG3MZf5aUv" -- 换成自己的
-- sys库是标配
_G.sys = require("sys")
_G.sysplus = require("sysplus")
--- 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编码,并打印出gb2312编码数据
参数 :
ucs2s:unicode小端编码数据,注意输入参数的字节数
返回值:
]]
local function testucs2ToGb2312(ucs2s)
print("ucs2ToGb2312")
local gb2312num = ucs2ToGb2312(ucs2s)--调用的是common.ucs2ToGb2312,返回的是编码所对应的字符串
--print("gb2312 code:",gb2312num)
print("gb2312 code:",string.toHex(gb2312num))
end
--[[
函数名:gb2312ToUcs2
功能 :gb2312编码 转化为 unicode十六进制小端编码数据并打印
参数 :
gb2312s:gb2312编码数据,注意输入参数的字节数
返回值:
]]
local function testgb2312ToUcs2(gb2312s)
print("gb2312ToUcs2")
local ucs2num = gb2312ToUcs2(gb2312s)
print("unicode little-endian code:" .. string.toHex(ucs2num)) -- 要将二进制转换为十六进制,否则无法输出
end
--[[
函数名:ucs2beToGb2312
功能 :unicode大端编码 转化为 gb2312编码,并打印出gb2312编码数据,
大端编码数据是与小端编码数据位置调换
参数 :
ucs2s:unicode大端编码数据,注意输入参数的字节数
返回值:
]]
local function testucs2beToGb2312(ucs2s)
print("ucs2beToGb2312")
local gb2312num = ucs2beToGb2312(ucs2s) -- 转化后的数据直接变成字符可以直接输出
print("gb2312 code :" .. string.toHex(gb2312num))
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(ucs2s)
print("ucs2ToUtf8")
local utf8num = ucs2ToUtf8(ucs2s)
print("utf8 code:" .. string.toHex(utf8num))
end
--[[
函数名:utf8ToGb2312
功能 :utf8编码 转化为 gb2312编码,并打印出gb2312编码数据
参数 :
utf8s:utf8编码数据,注意输入参数的字节数
返回值:
]]
local function testutf8ToGb2312(utf8s)
print("utf8ToGb2312")
local gb2312num = utf8ToGb2312(utf8s)
print("gb2312 code:" .. string.toHex(gb2312num))
end
--[[
函数名:gb2312ToUtf8
功能 :gb2312编码 转化为 utf8编码,并打印出utf8编码数据
参数 :
gb2312s:gb2312s编码数据,注意输入参数的字节数
返回值:
]]
local function testgb2312ToUtf8(gb2312s)
print("gb2312ToUtf8")
local utf8s = gb2312ToUtf8(gb2312s)
print("utf8s code:" .. utf8s)
end
sys.taskInit(function()
while 1 do
sys.wait(1000)
testucs2ToGb2312(string.fromHex("1162")) -- "1162"是"我"字的ucs2编码,这里调用了string.fromHex将参数转化为二进制,也就是两个字节。
testgb2312ToUcs2(string.fromHex("CED2")) -- "CED2"是"我"字的gb2312编码
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)
-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!
6.3 运行结果展示
通过 Luatoos 工具查看
七、总结
本文演示通过对不同字符编码格式的介绍和实际转换操作,使得大家更加了解了字符编码在计算机通信中的重要性,以及如何在不同编码格式之间进行转换。演示中使用的工具和硬件环境为 Air780EP 核心板和 Lua 编程语言,通过实际编码转换的例子,展示了字符编码转换在实际应用中的重要性。
在演示中,我们介绍了 Unicode(小端和大端)、GB2312 和 UTF-8 等常见编码格式,并展示了如何在 Lua 中使用 iconv 库进行编码转换。通过这个演示,大家可以了解到不同编码格式之间的差异,以及在不同场景下如何选择合适的编码格式。
此外,我们还提供了一个简单的 Lua 脚本,用于在不同编码之间进行转换测试,并打印出转换后的编码数据。这个脚本可以帮助大家更好地理解和掌握字符编码转换的原理和方法。
八、扩展
九、常见问题
给读者的话
本篇文章由
马梦阳
开发;本篇文章描述的内容,如果有错误、细节缺失、细节不清晰或者其他任何问题,总之就是无法解决您遇到的问题;
请登录合宙技术交流论坛,点击 文档找错赢奖金-Air780EP-LuatOS-软件指南-通用工具库-iconv字符集转换
用截图标注 + 文字描述的方式跟帖回复,记录清楚您发现的问题;
我们会迅速核实并且修改文档;
同时也会为您累计找错积分,您还可能赢取月度找错奖金!