⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 readme.txt

📁 对于通用的嵌入式系统字处理单元,本模块化程序可以快速实现常用汉字编码(GB2312,GB18030,BIG5码,Unicode码)的相互转换,无需库函数.从而实现使用单汉字字库显现多内码.具体参见re
💻 TXT
📖 第 1 页 / 共 2 页
字号:
一.概述
目前使用的汉字编码,有GB2312,GBK,GB18030,BIG5码,Unicode码,而Unicode码又可按照不同的存储格式分成UTF-8,UTF-16,UTF-32等格式,对于通用的嵌入式系统字处理单元,本模块化软件可以通过正确的输入输出实现常用汉字编码的相互转换.

二.. 产品总体技术指标:
1.	实现常用汉字编码到GB18030编码的转换,以便使用现有的GB18030字库,具体包含
1)	UTF-8编码  ->  GB18030编码
2)	UTF-16 编码 ->  GB18030编码
3)	BIG5编码    ->  GB18030编码

2.	实现常用汉字编码到 BIG5编码的转换,以便使用现有的BIG5字库,具体包含
1)	UTF-8编码  ->  BIG5编码
2)	UTF-16编码  ->  BIG5编码
3)	GB18030编码  ->  BIG5编码


三. 各编码规范介绍
GB2312		GB2312(1980年)一共收录了7445个字符,包括6763个汉字和682个其它符号。第一个数称为“区”,第二个数称为“位”。所以也称为区位码。1-9区是中文符号,16-55区是一级汉字,56-87区是二级汉字。为了兼容00-7f的ASCII编码,在区位码的高、低字节上分别加上A0。这样,汉字区的内码范围高字节从B0-F7,低字节从A1-FE,占用的码位是72*94=6768。其中有5个空位是D7FA-D7FE。

GBK1.0(GB13000)收录了21886个符号,它分为汉字区和图形符号区。汉字区包括21003个字符,符号区包括符号883个。其第一字节的值在 16 进制的 81~FE 之间,第二字节在 40~FE,除去xx7F一线。

GB18030	2000年的GB18030是取代GBK1.0的正式国家标准。该标准收录了27484个汉字,同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字。从汉字字汇上说,GB18030在GB13000.1的20902个汉字的基础上增加了CJK扩展A的6582个汉字(Unicode码0x3400-0x4db5),一共收录了27484个汉字。GB18030的编码采用单字节、双字节和4字节方案。其中单字节、双字节和GBK是完全兼容的。4字节编码的码位就是收录了CJK扩展A的6582个汉字。单字节部分使用0x00至0x7F码(对应于ASCII码的相应码)。双字节部分,首字节码从0x81至0xFE,尾字节码位分别是0x40至0x7E和0x80至0xFE。四字节部分采用GB/T 11383未采用的0x30到0x39作为对双字节编码扩充的后缀,这样扩充的四字节编码,其范围为0x81308130到0xFE39FE39。其中第一、三个字节编码码位均为0x81至0xFE,第二、四个字节编码码位均为0x30至0x39。
其中4字节编码的汉字部分(Unicode码0x3400~0x4db5),对应编码8139ee39~8139fe39;82308130~8230fe39;… 82358130~82358738

从ASCII、GB2312到GBK到GB18030,这些编码方法是向下兼容的,即同一个字符在这些方案中总是有相同的编码,后面的标准支持更多的字符。在这些编码中,英文和中文可以统一地处理。区分中文编码的方法是高字节的最高位不为0(高字节指编码的前一个字节,低字节指后一个字节)。按照程序员的称呼,GB2312、GBK都属于双字节字符集 (DBCS),在读取DBCS字符流时,只要遇到高位为1的字节,就可以将下两个字节作为一个双字节编码,而不用管低字节的高位是什么。
GB2312的两个字节的最高位都是1。但符合这个条件的码位只有128*128=16384个。所以GBK和GB18030的低字节最高位都可能不是1。

BIG5字符集  BIG5又称大五码或五大码,1984年由台湾财团法人信息工业策进会和五间软件公司创立,故称大五码。  Big5字符集共收录13,053个中文字,该字符集在中国台湾使用。Big5码使用了双字节储存方法,以两个字节来编码一个字。第一个字节称为“高位字节”,第二个字节称为“低位字节”。高位字节的编码范围0xA1-0xF9,低位字节的编码范围0x40-0x7E及0xA1-0xFE。注意,该字符集汉字区重复地收录了两个相同的字:“兀”(0xA461及0xC94A)、“嗀”(0xDCD1及0xDDFC),符号区与汉字区重复地收录了相同的 “十”(0Xa2CC及0xA451)、“卅”(0xA2CE及0xA4CA)。另外符号区重复地收录了数个相同的符号,分别对应编码(0xA2A4~0xA2A7及0Xf9fa~0xf9fd)
 
  
UCS		UCS 是 ISO制定的ISO10646标准所定义的 Universal Character Set, 采用4byte编码。ISO 10646 定义了一个 31 位的字符集. 然而, 在这巨大的编码空间中, 迄今为止只分配了前 65534 个码位 (0x0000 到 0xFFFD). UCS 不仅给每个字符分配一个代码, 而且赋予了一个正式的名字. 表示一个 UCS 或 Unicode 值的十六进制数, 通常在前面加上 "U+", 就象 U+0041 代表字符"拉丁大写字母A". UCS 字符 U+0000 到 U+007F 与 US-ASCII(ISO 646) 是一致的, U+0000 到 U+00FF 与 ISO 8859-1(Latin-1) 也是一致的.

Unicode 	Unicode由国际组织unicode.org设计,可以容纳全世界所有语言文字的编码方案。在1.0中是16位编码, 由U+0000到U+FFFF. 每个2byte码对应一个字符; 在2.0开始抛弃了16位限制, 原来的16位作为基本位平面, 另外增加了16个位平面, 相当于20位编码, 编码范围0到0x10FFFF.
 
Unicode 与UCS 	unicode2.0开始, Unicode 协会公布的 Unicode 标准 严密地包含了 ISO 10646-1 实现级别3的基本多语言面. 在两个标准里所有的字符都在相同的位置并且有相同的名字. ISO也承诺ISO10646将不会给超出0x10FFFF的UCS-4编码赋值, 使得两者保持一致.

UCS-2和UCS-4	UCS有两种格式:UCS-2和UCS-4。顾名思义,UCS-2就是用两个字节编码,UCS-4就是用4个字节(实际上只用了31位,最高位必须为0)编码。

BMP	UCS-4根据最高位为0的最高字节分成2^7=128个group。每个group再根据次高字节分为256个plane。每个plane根据第3个字节分为256行 (rows),每行包含256个cells。group 0的plane 0被称作 基本多语言面Basic Multilingual Plane, 即BMP。或者说UCS-4中,高两个字节为0的码位被称作BMP. UCS-2的两个字节前加上两个零字节,就得到了UCS-4的BMP。而目前的UCS-4规范中还没有任何字符被分配在BMP之外。

UTF		UCS只是规定如何编码,并没有规定如何传输、保存这个编码。例如“汉”字的UCS编码是6C49,我可以用4个ascii数字来传输、保存这个编码;也可以用utf-8编码:3个连续的字节E6 B1 89来表示它。关键在于通信双方都要认可。UTF-8、UTF-7、UTF-16都是被广泛接受的方案。UTF-8的一个特别的好处是它与ISO-8859-1完全兼容。UTF是“UCS Transformation Format”的缩写。

UTF-8	UTF-8就是以8位为单元对UCS进行编码。从UCS-2到UTF-8的编码方式如下:
UCS-2编码(16进制)	UTF-8 字节流(二进制)
0000 - 007F	0xxxxxxx
0080 - 07FF	110xxxxx 10xxxxxx
0800 - FFFF	1110xxxx 10xxxxxx 10xxxxxx
例如“汉”字的Unicode编码是6C49。6C49在0800-FFFF之间,所以肯定要用3字节模板了:1110xxxx 10xxxxxx 10xxxxxx。将6C49写成二进制是:0110 110001 001001, 用这个比特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89。

UTF-16		UTF-16以16位为单元对UCS进行编码。对于小于0x10000的UCS码,UTF-16编码就等于UCS码对应的16位无符号整数。对于不小于0x10000的UCS码,定义了一个算法。不过由于实际使用的UCS2,或者UCS4的BMP必然小于0x10000,所以就目前而言,可以认为UTF-16和UCS-2基本相同。但UCS-2只是一个编码方案,UTF-16却要用于实际的传输,所以就不得不考虑字节序的问题。

UTF-32, 仅使用了unicode范围(0到0x10FFFF)的32位编码, 相当于UCS-4的子集

UTF字节序的问题与BOM			UTF-8以字节为编码单元,没有字节序的问题。UTF-16以两个字节为编码单元,在解释一个UTF-16文本前,首先要弄清楚每个编码单元的字节序。Unicode规范中推荐的标记字节顺序的方法是BOM(Byte Order Mark). 在UCS编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前,先传输字符"ZERO WIDTH NO-BREAK SPACE"。这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。因此字符"ZERO WIDTH NO-BREAK SPACE"又被称作BOM。


具体来说,以上编码的内码分为三大类:GB、BIG5、UNICODE,相同内码的汉字编码转换主要是存储格式的不同以及出错处理,最终实现程序较短小。不同内码的汉字编码转换则需要通过查表实现,程序将占用一定的空间。
从GB2312到GBK到GB18030,这些编码方法是向下兼容的,即同一个字符在这些方案中总是有相同的编码,后面的标准支持更多的字符. Unicode编码汉字按照存储格式,有UTF-8,UTF-16,UTF-32等,其中UTF-32较少应用,主要考虑进行UTF-8,UTF-16间的相互转换,和它们与GB2312和GB10830和BIG5码间的转换。

四.主程序设计
	PC机端可执行程序项目为..\软件\ convertCode.dsp
		
?	文件内部使用的宏定义:为编码转换开关,
命名规则: _源码类型_目标嘛类型,其中GB表示GB18030码,LE表示LittleEndian,BE表示BigEndian,如_GB_BIG5表示将GB18030编码转换为BIG5码
取值规则: 需要相应编码转换时将对应的宏定义为1,反之为0
#define _UTF16BE_GB		1
#define _UTF16LE_GB		1
#define _UTF8_GB		1
#define _BIG5_GB		1

#define _UTF16BE_BIG5	1
#define _UTF16LE_BIG5	1
#define _UTF8_BIG5		1
#define _GB_BIG5		1

?	函数接口说明
1)	S8 Utf16TOGb18030(U16* pu16InputCode, U8* pu8OutputCode, U8* pu8OutputLen)
/***************************************************************************
*	函数名称:	Utf16TOGb18030
*	函数功能	:	将Utf16编码的字符转换为GB18030编码
*	接口描述:
*				
*		输入参数:
*				pu16InputCode - 输入的Utf16编码字符的存储地址
*				pu8OutputCode - 供存放输出的GB18030编码字符的首地址
*				pu8OutputLen  - 供存放输出的GB18030编码字符字节数的地址

*		返回参数:CONVERT_OK - 转换成功  CONVERT_ERROR - 转换失败  
*				 转换成功时,输出的字符存放在pu8OutputCode,长度存放在pu8OutputLen
*
*						
*
*	补充说明:
*				转换通过查表(即TB_UTF16_GB)得到,但节约空间起见,此表只输出前2字节结果
*				对于有4字节的汉字,再通过SearchCodeTable查表得到后面2字节.
*****************************************************************************/

2)	S8 Utf8TOGb18030(U8* pu8InputCode, U8 u8InputLen, U8* pu8OutputCode, U8* pu8OutputLen)
/***************************************************************************
*	函数名称:	Utf8TOGb18030
*	函数功能	:	将Utf8编码的字符转换为GB18030编码
*	接口描述:
*				
*		输入参数:
*				pu8InputCode - 输入的Utf8编码字符的存储地址
*				u8InputLen   - 输入的Utf8编码字符的长度
*				pu8OutputCode - 供存放输出的GB18030编码字符的首地址
*				pu8OutputLen  - 供存放输出的GB18030编码字符字节数的地址

*		返回参数:CONVERT_OK - 转换成功  CONVERT_ERROR - 转换失败  
*				 转换成功时,输出的字符存放在pu8OutputCode,长度存放在pu8OutputLen
*
*						
*
*	补充说明: 
*				算法是先将Utf8编码字符转换为Utf16编码,然后类似Utf16TOGb18030()
*****************************************************************************/

3)	S8 Big5TOGb18030(U8* pu8InputCode, U8 u8InputLen, U8* pu8OutputCode, U8* pu8OutputLen)
/***************************************************************************
*	函数名称:	Big5TOGb18030
*	函数功能	:	将BIG5编码的字符转换为GB18030编码
*	接口描述:
*				
*		输入参数:
*				pu8InputCode - 输入的BIG5编码字符的存储地址
*				u8InputLen   - 输入的BIG5编码字符的长度
*				pu8OutputCode - 供存放输出的GB18030编码字符的首地址
*				pu8OutputLen  - 供存放输出的GB18030编码字符字节数的地址

*		返回参数:CONVERT_OK - 转换成功  CONVERT_ERROR - 转换失败  
*				 转换成功时,输出的字符存放在pu8OutputCode,长度存放在pu8OutputLen
*
*
*	补充说明:
*****************************************************************************/

4)	S8 Gb18030TOBig5(U8* pu8InputCode, U8 u8InputLen, U8* pu8OutputCode, U8* pu8OutputLen)
/***************************************************************************
*	函数名称:	Gb18030TOBig5
*	函数功能	:	将Utf8编码的字符转换为BIG5编码
*	接口描述:
*				
*		输入参数:
*				pu8InputCode - 输入的GB18030编码字符的存储地址
*				u8InputLen   - 输入的GB18030编码字符的长度
*				pu8OutputCode - 供存放输出的BIG5编码字符的首地址
*				pu8OutputLen  - 供存放输出的BIG5编码字符字节数的地址

*		返回参数:CONVERT_OK - 转换成功  CONVERT_ERROR - 转换失败  
*				 转换成功时,输出的字符存放在pu8OutputCode,长度存放在pu8OutputLen
*
*	补充说明:
*****************************************************************************/

5)	S8 Utf16TOBig5(U16* pu16InputCode, U8* pu8OutputCode, U8* pu8OutputLen)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -