汉字的ASC值为什么会是负数
2013-07-20 14:50
246 查看
一、汉字的编码
1.国标码
“中华人民共和国国家标准信息交换汉字编码”,标准号GB2312-80。该编码字符集收录了一级汉字3755个,二级汉字3008个,图形符号682个,共7445个。
在GB2312-80代码表中,纵向分为0~93,共94行;横向也是0~93,共94列。行与列分别用7位二进制码表示,第一字节表示行,第二字节表示列。其值从0100001到1111110(十六进制为21-7E)。这正是ASCII码的可打印字符的编码范围。国标码是将第一字节和第二字节连写而得,习惯上称第一字节为“高字节”,第二字节为“低字节”,一般用十六进制表示。
2.区位码
整个代码表分为94个区(对应高字节),每个区94个位(对应低字节),合起来就是区位码,按如下规则确定:
高位内码=高字节国标码-20H
低位内码=低字节国标码-20H
例如,汉字“啊”在16行的第l列,则它的区位码是“1001H”。
注:区位码的高字节和低字节的取值范围均是01H~5EH。
3.机内码
也就是内码。汉字区位码的区码和位码的范围在1~94内,如果直接作为机内码必将与基本的ASCII码冲突。为避免与基本ASCII码中的控制码与字符码的冲突,分别在区码、位码上增加A0H(即10100000)。所以,内码同样占两个字节,分别称为高位内码与低位内码,按如下规则确定:
高位内码=区码+A0H
低位内码=位码+A0H
例如,汉字“啊”的内码是“B0A1H”(即1011000010100001)。
注:高位内码与低位内码的取值范围均是A1H~FEH。
二、汉字的输出显示
汉字的输出主要是指汉字字形的输出,方式主要是显示和打印两种。实际上,每一个汉字都是一个特定的图形,用一个点阵来表示。点阵的每个点位只有两种状态:有点或无点。若用二进制代码来表示即为该位取值为1 表示有点,取值为0表示无点。
例如,如果用16×16点阵来表示一个汉字,则该汉字图形由16行16列共256个点构成,这256个点需用256个二进制的位来描述,需要32个字节来存储用于存放图形信息,这样的二进制代码串称为汉字的“字模”。
所有汉字和各种符号的点阵信息就组成汉字的“字模库”(简称字库)。字模的表示顺序为:先从左到右,再从上到下。也就是先画第一行左上方的8个点,再是右上方的8个点,然后是第二行左边8个点,右边8个点,以此类推。
三、汉字的显示原理
1.从键盘输入的汉字经过键盘管理模块,变换成机内码。
2.然后经字模检索程序,查到机内码对应的点阵信息在字模库的地址。
3.从字库中检索出该汉字点阵信息。
4.利用显示驱动程序将这些信息送到显示卡的显示缓冲存储器中。
5.显示器的控制器把点阵信息整屏顺次读出,并使每一个二进制位与屏幕的一个点位相对应,就可以将汉字字形在屏幕上显示出来。
四、用区位码获取汉字的点阵信息
以16×16的点阵汉字库文件为例。一个汉字用了256个点共32个字节表示。汉字共分94区,每个区有94位汉字。机内码用两个字节表示,第一个字节存储区号(qh),为了和ASCII码相区别,范围从十六进制的A1H开始(小于80H地为ASCII码字符),对应区码的第一区;第二个字节是位号(wh),范围也从A1H开始,对应某区中的第一个位码。这样,将汉字机内码减去A0A0H就得到该汉字的区位码。从而可以得到汉字在字库中的具体位置:
位置=(94*(qh-1) + wh-1) * 一个汉字字模占用的字节数
对于16×16的点阵汉字库,汉字在字库中的具体位置的计算公式就是:(94*(qh-1)+wh-1)*32。例如,“房”的机内码为十六进制的B7BF,则其区位码是B7BFH-A0A0H=171FH,转化为十进制就是2331,在汉字库中的位置就是32*[94*(23-1)+(31-1)]=67136字节以后的32个字节为“房”的显示点阵。
自己写的一个demo,抓取汉字的ASC值:
![](https://img-blog.csdn.net/20130720144546812?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd29xaW4xOTkw/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
可以看到用ASC方法抓取的ASCII的值是-12590,是一个负数。
ASCW返回的是Unicode(宽型)字符代码,抓取的值是25105。
说到ASCII值,介绍几个方法:
Asc、AscB、AscW 是 VBScript 中的三个函数,其区别如下。
Asc(string) 返回与字符串的第一个字母对应的 ANSI 字符代码。返回值:英文 >0,中文 <0。
AscB(binstr) 适用于二进制数据。AscB 不是返回第一个字符的字符代码,而是返回首字节。
AscW(string) 是为使用 Unicode 字符的 32 位平台提供的。它返回 Unicode (宽型)字符代码,因此可以避免从 ANSI 到 Unicode 的代码转换。它的返回值与 JavaScript 中的
charCodeAt 相同。返回值:英文 >0,中文 >255。
1.国标码
“中华人民共和国国家标准信息交换汉字编码”,标准号GB2312-80。该编码字符集收录了一级汉字3755个,二级汉字3008个,图形符号682个,共7445个。
在GB2312-80代码表中,纵向分为0~93,共94行;横向也是0~93,共94列。行与列分别用7位二进制码表示,第一字节表示行,第二字节表示列。其值从0100001到1111110(十六进制为21-7E)。这正是ASCII码的可打印字符的编码范围。国标码是将第一字节和第二字节连写而得,习惯上称第一字节为“高字节”,第二字节为“低字节”,一般用十六进制表示。
2.区位码
整个代码表分为94个区(对应高字节),每个区94个位(对应低字节),合起来就是区位码,按如下规则确定:
高位内码=高字节国标码-20H
低位内码=低字节国标码-20H
例如,汉字“啊”在16行的第l列,则它的区位码是“1001H”。
注:区位码的高字节和低字节的取值范围均是01H~5EH。
3.机内码
也就是内码。汉字区位码的区码和位码的范围在1~94内,如果直接作为机内码必将与基本的ASCII码冲突。为避免与基本ASCII码中的控制码与字符码的冲突,分别在区码、位码上增加A0H(即10100000)。所以,内码同样占两个字节,分别称为高位内码与低位内码,按如下规则确定:
高位内码=区码+A0H
低位内码=位码+A0H
例如,汉字“啊”的内码是“B0A1H”(即1011000010100001)。
注:高位内码与低位内码的取值范围均是A1H~FEH。
二、汉字的输出显示
汉字的输出主要是指汉字字形的输出,方式主要是显示和打印两种。实际上,每一个汉字都是一个特定的图形,用一个点阵来表示。点阵的每个点位只有两种状态:有点或无点。若用二进制代码来表示即为该位取值为1 表示有点,取值为0表示无点。
例如,如果用16×16点阵来表示一个汉字,则该汉字图形由16行16列共256个点构成,这256个点需用256个二进制的位来描述,需要32个字节来存储用于存放图形信息,这样的二进制代码串称为汉字的“字模”。
所有汉字和各种符号的点阵信息就组成汉字的“字模库”(简称字库)。字模的表示顺序为:先从左到右,再从上到下。也就是先画第一行左上方的8个点,再是右上方的8个点,然后是第二行左边8个点,右边8个点,以此类推。
三、汉字的显示原理
1.从键盘输入的汉字经过键盘管理模块,变换成机内码。
2.然后经字模检索程序,查到机内码对应的点阵信息在字模库的地址。
3.从字库中检索出该汉字点阵信息。
4.利用显示驱动程序将这些信息送到显示卡的显示缓冲存储器中。
5.显示器的控制器把点阵信息整屏顺次读出,并使每一个二进制位与屏幕的一个点位相对应,就可以将汉字字形在屏幕上显示出来。
四、用区位码获取汉字的点阵信息
以16×16的点阵汉字库文件为例。一个汉字用了256个点共32个字节表示。汉字共分94区,每个区有94位汉字。机内码用两个字节表示,第一个字节存储区号(qh),为了和ASCII码相区别,范围从十六进制的A1H开始(小于80H地为ASCII码字符),对应区码的第一区;第二个字节是位号(wh),范围也从A1H开始,对应某区中的第一个位码。这样,将汉字机内码减去A0A0H就得到该汉字的区位码。从而可以得到汉字在字库中的具体位置:
位置=(94*(qh-1) + wh-1) * 一个汉字字模占用的字节数
对于16×16的点阵汉字库,汉字在字库中的具体位置的计算公式就是:(94*(qh-1)+wh-1)*32。例如,“房”的机内码为十六进制的B7BF,则其区位码是B7BFH-A0A0H=171FH,转化为十进制就是2331,在汉字库中的位置就是32*[94*(23-1)+(31-1)]=67136字节以后的32个字节为“房”的显示点阵。
自己写的一个demo,抓取汉字的ASC值:
可以看到用ASC方法抓取的ASCII的值是-12590,是一个负数。
ASCW返回的是Unicode(宽型)字符代码,抓取的值是25105。
说到ASCII值,介绍几个方法:
Asc、AscB、AscW 是 VBScript 中的三个函数,其区别如下。
Asc(string) 返回与字符串的第一个字母对应的 ANSI 字符代码。返回值:英文 >0,中文 <0。
AscB(binstr) 适用于二进制数据。AscB 不是返回第一个字符的字符代码,而是返回首字节。
AscW(string) 是为使用 Unicode 字符的 32 位平台提供的。它返回 Unicode (宽型)字符代码,因此可以避免从 ANSI 到 Unicode 的代码转换。它的返回值与 JavaScript 中的
charCodeAt 相同。返回值:英文 >0,中文 >255。
相关文章推荐
- 面试题:问题:Java中,char型变量中能不能存储一个中文汉字,为什么?
- char型变量中能不能存贮一个中文汉字?为什么?
- char 型变量中能不能存储一个中文汉字,为什么?
- 为什么Dijkstra算法不适用边长为负数的情况
- 关于为什么负数要整数取反+1表示,而不指定首位为符号位,其它位为数值位。
- 在ue中编辑汉字为什么是横的
- char型变量中能不能存贮一个中文汉字?为什么?
- 为什么负数的反码在取反后还要加一?
- url中的汉字encode转换,为什么?
- xml中不能包含 汉字元素吗? 为什么我用汉字,就编译出错,改成 拼音就可以?(看代码)
- 为什么负数在西方的经历如此坎坷?
- java基础 2、char型变量中能不能存贮一个中文汉字?为什么?
- 为什么不用汉字编程 推荐
- mysql中要存储汉字要将数据类型定义为什么?
- 负数在计算机中如何表示,计算机中负数为什么用补码表示?
- 在UTF-8中,一个汉字为什么需要三个字节?
- 韩国为什么‘恢复’汉字?!
- 为什么是string::size_type而不是int?---顺便聊聊无符号数和负数的比较
- 关于int范围中负数最小值的绝对值比整数最大值大初学C,问题源自:为什么C中的int类型(16位)的下溢下限为-32768而上溢上限却是32767。 首先说吧,32767很容易理解,32767=
- 汉字编码-区位码、国标码和内码发展和区别以及为什么要加2020H、8080H