社区
单片机/工控
帖子详情
汉字编码问题
devzhao
2003-06-19 10:34:07
有谁知道:
汉字内码与unicode之间的换算,
或汉字区位码与unicode之间的换算。
请不吝赐教!
...全文
138
4
打赏
收藏
汉字编码问题
有谁知道: 汉字内码与unicode之间的换算, 或汉字区位码与unicode之间的换算。 请不吝赐教!
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
4 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
坐着等天亮
2003-06-20
打赏
举报
回复
我没有这个表,不过你到Linux下看看,有没有的?
坐着等天亮
2003-06-20
打赏
举报
回复
转换的话要一个表的。
没有固定的逻辑关系的。
csdnadm
2003-06-20
打赏
举报
回复
UCDOS软件中的文件HZK16和文件ASC16分别为16×16的国标汉字点阵文件和8×16的ASCII码点阵文件,以二进制格式存储。在文件HZK16中,按汉字区位码从小到大依次存有国标区位码表中的所有汉字,每个汉字占用32个字节,每个区为94个汉字。在文件ASC16中按ASCII码从小到大依次存有8×16的ASCII码点阵,每个ASCII码占用16个字节。
在PC机的文本文件中,汉字是以机内码的形式存储的,每个汉字占用两个字节:第一个字节为区码,为了与ASCII码区别,范围从十六进制的0A1H开始(小于80H的为ASCII码字符),对应区位码中区码的第一区;第二个字节为位码,范围也是从0A1H开始,对应某区中的第一个位码。这样,将汉字机内码减去0A0AH就得该汉字的区位码。
例如汉字“房”的机内码为十六进制的“B7BF”,其中“B7”表示区码,“BF”表示位码。所以“房”的区位码为0B7BFH-0A0A0H=171FH。将区码和位码分别转换为十进制得汉字“房”的区位码为“2331”,即“房”的点阵位于第23区的第31个字的位置,相当于在文件HZK16中的位置为第32×[(23-1) ×94+(31-1)]=67136B以后的32个字节为“房”的显示点阵。
在本单片机系统中,起始地址的高4位为页号,送P1口,低15位为数据区地址,送指针DPTR。利用“MOVX”指令连续取32个字节送LCD的相应位置,就能实现正确的汉字显示。
ASCII码的显示与汉字的显示基本原理相同。在文件ASC16中不存在机内码的问题,其显示点阵直接按ASCII码从小到大依次排列,只是每个ASCII码在文本文件中只占1个字节且小于80H,而且ASCII码为8×16点阵,所以在ASCII16文件中,每个ASCII码的点阵也只占16个字节。
首先提取16×16的国标汉字点阵和8×16的ASCII码点阵(如UCDOS软件中的HZK16和ASC16)并将其直接写入29F040。其中HZK16(共256KB)点0~7页。为了便于编程,ASC16虽然只有4KB,也单独占用第8页。其余剩下的空间用来存储汉字语句的编码。
由于240×128点阵的LED显示器每个只能显示15个汉字(16×16点阵汉字),即30个字节。所以可将需要显示的语句按30个字节为1行进行编写,不足30个字符的则补空格。在PC机上进行录入时,每行30个字符再加上回车键和换行符,实占32个字符。所录入的语句以纯文本形式存盘,再将该文本文件以二进制的形式写入29F040的第9页。那么,以后根据需要显示的语句行号便可以进行正确的显示。此,作者推出荐使用DOS版本的WPS软件的“编辑非文收文件”功能,它能清楚地显示每行是否有30个字符。
根据以上原则,显示1行汉字的具体程序框图如图2所示。
为方便读者,将已经在实际应用中中通过的汇编子程序列出如下(关于LCD控制器T6963的用户法请见参考文献1)。
LCDCOM EQU 7FF9H
LCDDAT EQU 7FF8H
;显示1行汉字子程序
;汉字语句位置编号DPTR;行号:R6 PRHZ:MOV 24H,DPH
MOV 25H,DPL
PUSH DPH
PUSH DPL
MOV A,DPH ;计算页号
RR A
RR A
ADD A,#9;从第9区开始存放每行字符的机内码
ORL A,#0F0H
MOV P1,A
LCALL RL245 ;行号乘以32(每行32个字符)
SETB 24H,7 ;数据地址位于8000H~0FFFFH
MOV DPH,24H
MOV DPL,25H
MOV R0,#0E0H
MOV R7,#30 ;连续取出30个字符至0E0H内部数据存储器
PRHZ3:MOVX A,@DPTR
MOV @R0,A
INC R0
INC DPTR
DJNZ R7,PRHZ3
MOV 1DH,#30 ;显示0E0H后的一行字符(共30个)
MOV R5,#0 ;当前列R5
MOV R0,#0E0H
MOV A,#7FH ;是否为ASCII码?
CLR C
SUBB A,@R0
JC DPHZ1
MOV 26H,@R0
INC R0
MOV 24H,R6 ;ASCII码显示
MOV 25H,R5
LCALL PRASCII
SJMP PRHZ4
DPHZ1:MOV 24H,@R0 ;是汉字则将机内码送24H25H
INC R0
MOV 25H,@R0
INC R0
MOV A,25H
CLR C
SUBB A,#0A1H ;机内码转换为二进制的区码和位码
MOV 25H,A
MOV A,24H
CLR C
SUBB A,#0A1H
LCALLDPONHZ ;显示1个汉字
DEC 1DH
INC R5
PRHZ4:INC R5
DJNZ 1DH,PRHZ5
POP DPL
POP DPH
RET
PR0:MOV DPTR,#LCDCOM ;读状态
MOVX A,@DPTR
RET
PR01:LCALLPR0 ;读、写一数据前
JNB ACC.0,PR01
JNB ACC.1,PR01
RET
PR02:LCALL PR0 ;连续读前
JNB ACC.2,PR02
RET
PR03:LCALL PR0 ;连续写前
JNB ACC.3,PR02
RET
PR1:LCALL PR01 ;双字节参数R2,R3
MOV A,R2
LCALL PR14
PR11:LCALL PR01 ;单字节参数R3
MOV A,R3
LCALL PR14
PR12:LCALL PR01 ;无参数指令R4
MOV A,R4
SJMP PR15
PR14:MOV DPTR,#LCDDAT
PR15:MOVX @DPTR,A
RET
RL245:MOV R7,#5 ;24H25H左移5
RLL1:CLR C
MOV A,25H
RLC A
MOV 25H,A
MOV A,24H
RLC A
MOV 24H,A
DJNZ R7,RLL1
RET
;行位置R6(0~7),列位置R5(0~29),汉字区别24H,位码25H
DPONHZ:MOV A,24H ;显示1个汉字
MOV B,#94 ;每区94个汉字
MUL AB
ADD A,25H
MOV 25H,A
CLR A
ADDC A,B
MOV 24H,A
RR A ;获得32KB为1页的页号
RR A
ORL A,#0F0H
MOV P1,A ;页号送P1口
LCALL RL245 ;汉字序号乘以32
SETB 24H,7 ;因为存储器位于单片机系统的7FFFH~0FFFFH
MOV DPH,24H
MOV DPL,25H
MOV R2,#32 ;在该位置连续取出32个字节
MOV R1,#0C0H
DPHZ2:MOVX A,@DPTR
INC DPTR
MOV @R1,A
INC R1
DJNZ R2,DPHZ2
MOV R1,#0C0H
MOV A,R6 ;根据行列位置计算LCD指针
MOV B,#16
MUL AB
MUL B,#30
MUL AB
ADD A,R5
MOV 25H,A
MOV R2,A
CLR A
ADDC A,B
MOV 24H,A
MOV R3,A
MOV 26H,#16 ;将取出的点阵送LCD显示
PRHZ6:MOV R4,#24H
LCALL PR1 ;双字节参数R2,R3
MOV A,@R1
MOV R3,A
INC R1
MOV R4,#0C0H
LCALL PR11 ;单字节参数R3
MOV A,@R1
MOV R3,A
INC R1
MOV R4,#0C0H
LCALL PR11
MOV A,#30
ADD A,25H
MOV R2,A
CLR A
ADDC A,24H
MOV R3,A
MOV 24H,A
DJNZ 26H,PRHZ6
RET
Hermit
2003-06-19
打赏
举报
回复
汉字内码,由两个字节组成,两个字节分别减去A0H(160),得到的前一个字节是区,后一个字节是位,算该字在16点阵字库中的位置时,((区-DD)*98+位)*32,32指每个16点阵汉字32字节.注意:有些字库前16区省略一些无用的区故要减去DD.公式给的不一定完全正确,
汉字2312的字库
是87区,每区94个汉字,1-9区是标点,制表符号,日文X假名等,10-15空,16-55是汉字
一级字库(常用),5590-5594空.56区到87区是二级字库.共6763个中文.
16*16点阵字库就是32字节一个字.但不同的16*16点阵字库的
排列方法不一定一样,如UCDOS和CCDOS,有的还把10-15区空的压缩了.
机内码就是你在DELPHI中获得的输入的汉字字符.比如:"啊"的16进制表示.
区码 := (机内码高8位-$A0);
位码 := (机内码低8位-$A0);
偏移量 := ((区码-1)*94+(位码-1))*32
注意区码和位码是以1为开始的.
汉字编码
问题
及用C程序实现将GB2312的6763个汉字按输出
由于常常要和汉字处理打交道,因此,我常常受到
汉字编码
问题
的困扰。在不断的打击与坚持中,也积累了一点
汉字编码
方面的经验,想和大家一起分享。
一、
汉字编码
的种类
汉字编码
中现在主要用到的有三类,包括GBK,GB2312和Big5。
1、GB2312又称国标码,由国家标准总局发布,1981年5月1日实施,通行于大陆。新加坡等地也使用此编码。它是一个简化字的编码规范,当然也包括其他的符号、字母、日文假名等,共7445个图形字符,其中汉
JSP/Servlet 中的
汉字编码
问题
(转)
JSP/Servlet 中的
汉字编码
问题
网上就 JSP/Servlet 中 DBCS 字符编码
问题
有许多优秀的文章和讨论,本文对它们作一些整理, 并结合 IBM WebSphere Application Server 3.5(WAS)的解决方法作一些说明,希望它不是多余的。 1.
问题
的起源 每个国家(或区域)都规定了计算机信息交换用的字符编码集,如美国的 ASCII,中国的 GB2312 -80,日本的 JIS 等,作为该国家/区域内信息处理的基础,有着统一编码的重要作用。字符编码
java 将
汉字编码
_JAVA中的
汉字编码
问题
一、常见的字符编码计算机中存储、处理和传送的数据是二进制的形式。各种文字、符号也必须用二进制数编码来表示,因此出现了一些不同形式的字符编码。1.ASCII码ASCII码是美国标准信息交换代码(American Standard Code for Information Interchange),是微机中最常采用的编码。ASCII有7位码和8位码两种版本。国际通用的7位ASCII码是用7位二进制数表...
判断汉字 编码方式
http://blog.csdn.net/lengshine/article/details/5470545 由于常常要和汉字处理打交道,因此,我常常受到
汉字编码
问题
的困扰。在不断的打击与坚持中,也积累了一点
汉字编码
方面的经验,想和大家一起分享。 一、
汉字编码
的种类
汉字编码
中现在主要用到的有三类,包括GBK,GB2312和Big5。 1、GB2312又称国标码,
汉字编码
问题
(附编码察看器)
技术组 >> 课堂探索 快典网->
汉字编码
查询 http://bm.kdd.cc/index.asp
汉字编码
问题
(附编码察看器) 发布:卢华 日期:2007-9-11
汉字编码
问题
一、GB2312-8
单片机/工控
27,510
社区成员
28,796
社区内容
发帖
与我相关
我的任务
单片机/工控
硬件/嵌入开发 单片机/工控
复制链接
扫一扫
分享
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章