汉字编码与拼音输入法
时间:2024-01-04 19:37:01
计算机处理汉字信息的前提是编码每个汉字,统称为汉字编码。汉字信息在系统中传输的过程是汉字编码转换的过程。
汉字交换码:当汉字信息处理系统或通信系统之间传输信息时,每个汉字规定的统一代码,中国指定的汉字交换码国家标准信息交换用汉字代码字符集-基本集GB 2312-80,又称国标码。 国家标准代码:所有汉字代码均应遵循本标准。本标准基于汉字机内码、汉字库设计、汉字输入码转换、输出设备汉字地址码等。GB 2312-80是国家标准码。代码规定:一个汉字用两个字节表示,每个字节只有7个字节ASCII码相似。 区位码:将GB 所有字符2312-80组成94×94方阵,每行称为区,编号为0l~94;每列称为位l~94,这样得到GB 2312-80区位图,用区位图的位置表示汉字编码,称为区位码。 机内码:为避免ASCII码和国标码同时使用时产生二义性问题,大部分汉字系统都采用将国标码每个字节高位置1作为汉字机内码。这样既解决了汉字机内码与西文机内码之间的二义性,又使汉字机内码与国标码具有极简单的对应关系。 汉字机内码、国标码、区位码的关系是:区位码(十进制)的两个字节分别转换为十六进制后加20H获得相应的国家标准码;机内码为汉字交换码(国家标准码)两个字节的最高位分别加1,即汉字交换码(国家标准码)分别加80字节H获得相应的机器内码;区位码(十进制)的两个字节分别转换为十六进制A0H获取相应的机内码。 |
GB2312编码包括符号、数字、字母、日语、制表符等。当然,最重要的部分是中文,它使用16位编码方法,简体中文的编码范围从B 0A 1一直到F7FE,可参考完整的编码表http://ash.jp/code/cn/gb2312tbl.htm。
简单的汉字编码对照表
汉字编码原理
1.国家标准汉字代码系统
汉字数量多,属性丰富,所以汉字代码系统也比较复杂,包括:
(1)汉字机内码。它们是计算机汉字系统中汉字的表达方式,是计算机汉字系统
基本代码。
(2)汉字交换码。它们是国家标准汉字(如机内码)信息交换的代码标准。
(3)汉字输入码。它们是在计算机标准键盘上输入汉字的各种代码系统。
(4)汉字点阵码。它们是在计算机屏幕上显示和在打印机上打印输出汉字的代码体系。
(5)汉字字形控制码。为打印各种风格的字体和字体制定的代码。
有些代码系统必须有统一的国家标准,而有些则不需要统一。近年来,中国制定了
今后将继续完善系列汉字信息处理的国家标准,与国际统一。
2. 国家标准汉字交换码
中国制定了中华人民共和国国家标准信息交换汉字代码GB2312—80,
这种代码也叫国标代码。国标代码中有375个一级汉字,3008个二级汉字。
图形符号682个,三个字符7445个。
在国标GD2312-80中规定,所有国标汉字和符号分配在94行和94列方阵中,
方阵的每一行都叫区,从01区到94区,每一列都叫位
位于94位,方阵中的每个汉字和符号的区号和位号组合在一起形成了四个阿拉伯
数字是它们的区位码。区位码的前两位是它的区号,后两个是它的区号。使用区位码
一个汉字或符号可以唯一确定。另一方面,任何汉字或符号也对应于唯一的符号
区位码。汉字母字的区位码为3624,表示在方阵36区24位,问号为?
位码为0331,03区3l位。
所有汉字和符号分为以下四组:
(1)01区至15区。01区至09区为标准符号区,10区至15区为标准符号区。
自定义符号区。
从01区到09区的具体内容如下;
1)01区。一般有202个符号,如间隔符、标点符、操作符、单位符号和制表符;
2)02区。60个序号,如1.~20.、(1)~(20)、①~⑩及(一)~(十);
3)03区。数字22个,如0—9及X一XII,52个英文字母,其中大写A—Z、小写
a—z各26个;
4)04区。83个日本平假名;
5)05区。日文片假名86个;
6)06区。48个希腊字母;
7)07区。66个俄语字母;
8)08区。汉语拼音符号a—z26个;
9)09区。37个汉语拼音字母。
(2)从16区到55区。一级常用汉字区,包括3755个统一汉字。这40个区域的汉字
按中文拼音排序,同音字按笔划顺序排序。其中,55区90194位未定义汉字。
(3)从56区到87区。二级汉字区,包括3008个二级汉字,按部首排序。
(4)从88区到94区。自定义汉字区。
从10区到15区的自定义符号区和从88区到94区的自定义汉字区可以由用户自己定制
定义国家标准中未定义的符号和汉字。
3. 国家标准汉字机内码
汉字的内码是指在计算机中表示汉字的编码。内码与区位码略有不同。
所述,汉字区位码的区码和位码值均为1~如果94之间直接使用区位码作为机内码,则
会与基本ASCII代码混淆。为避免机代码与基本代码的混淆。ASCII代码冲突需要避免基本冲突ASCII码
控制码(00H~1FH),还需与基本ASCII码中的字符不同。为了实现这两点,可以
先在区码和位码分别加20个H,在此基础上加80H(此处“H说前两位数字是16
进制数)。经过这些处理,一个汉字需要分别占汉字需要分别占用两个字节 称为高位字
这两个字节的内码按以下规则表示:
高字节=区码 20H 80H(或区码 A0H)
低位字节=位码 20H 80H(或位码 AOH)
由于汉字的区码和位码的取值范围为01H~5EH(即十进制01~94),
因此,汉字的高字节和低字节的值范围是A1H~FEH(即十进制161~254)。
例如,汉字“啊”的区位码为1601,区码和位码分别用十六进制表示即为1001H,它
机内码的高位字节是B0H,低位字节为A1H,机内码就是B0A1H。
4. 汉字输入码
在计算机标准键盘上,汉字的输入与西文的输入有很大的不同。一次输入西文
键直接输入相应的字符或代码,键入和输入意义相同。但在计算机上
输入汉字时,键入是指键的动作,即键盘操作过程,而输入是指所需的
键盘操作的目的是将汉字或字符发送到指定的地方。目前汉字输入方法很多,所以有
各种汉字输入码。汉字输入码面向输入者,不同的输入码操作过程不同,但是
结果是一样的。无论采用何种输入方法,所有输入的汉字都以内码的形式存储在机器中
介质中,汉字传输时,以交换码的形式发送和接收。
国标GB2312-80规定的区位码和使用多年的电报码可作为输入码。这种汉字编码
与输入代码一一对应,具有标准性质。他们编码的字符是10个阿拉伯数字,每个字符
汉字的码长是四个等长的数字。
其他编码有很多种,可以从以下几点来讨论:
(2)编码类型。可分为拼音码、字形码、音形组合码等类型。
(2)编码规则。不同的编码方案差别很大,有些规则简单,学习起来容易记住,‘
有些规则复杂,很难记住1亿。
(3)编码字符集。有字母键,有数字键,有字母键加数字键,或者有
更多键作编码字符集。
(4)编码长度。与编码字符集大小有关,字符集越大,编码长度越短。采用26
个字母的编码,其码长一般为四位。
(5)对应关系。除上面提到的区位码和电报码为一一对应的无重码编码外,其他现有
的编码方案均有一定数量的重码。所谓重码即一码对应多字。有许多编码为了增加输入的
灵活性,同一汉字用多个码来对应,例如双音编码。
(6)单宁和词汇的编码。现有的编码方案,为了提高效率,除了单字外还规定了词汇
的编码,甚至使用者可以自行增加词汇库中的词汇,但在提高效率的同时也增加了记亿和
操作的复杂性。
(7)码表的类型和大小。从汉字输入码到机内码的转换一股需要在机内检索码表。如
果输入码和机内码存在简单的函数关系,有公式可以计算,如区位码等编码就不需要码表,
其他没有简单函数关系的编码就需要码表。码表大小与数据结构、单字数量、词汇数量等
因素有关。国标血2312—80规定的6763个一、二级汉字,备类编码的码表从几千字节到
几万字节。随着词汇旦的增加,有的码表达到了若干兆字节。
5. 汉字的点阵码
汉字的显示和输出,普遍采用点阵方法。由于汉字数量多且字形变化大,对不同字形
汉字的输出,就有不同的点阵字形。所谓汉字的点阵码,就是汉字点阵字形的代码。存储
在介质中的全部汉字的点阵码又称为字库。 .
16x16点阵的汉字其点阵有16行,每一行上有16个点。如果每一个点用一个二进制
位来表示,则每一行有16个二进制位,需用两个字节来存放每一行上的16个点,并且规
定其点阵中二进制位0为白点,1为黑点,这样一个16X16点阵的汉字需要用2×t6即32
个字节来存放。依次类推,24×24点阵和32×32点阵的汉字则依次要用72个字节和128
个字节存放一个汉字,构成它在字库中的字模信息。
要显示或打印输出一个汉字时,计算机汉字系统根据该汉字的机内码找出其字模信息
在字库中的位置,再取出其字模信息作为字形在屏幕上显示或在打印机上打印输出。
嵌入式系统中文输入法的设计
摘 要:在基于嵌入式系统的智能终端中,中文人机交互界面是必须的功能,某些系统还要求中文文本输入。本文介绍了一种占用较少资源并适于在MCU上实现的中文输入法。
关键词:嵌入式系统;中文输入法;数字键盘
引言
目前,以LCD和数字键盘实现的人机交互式界面在智能终端中广泛采用。在不同的应用场合,对人机界面的要求也不同,一些情况下只要求简单参数的显示和选择,而在一些信息终端中,还要求文字的输入。
在使用高性能CPU和标准显示设备的情况下,实现友好的人机界面可采用商用嵌入式系统( 如Linux或WinCE)所支持的GUI程序。但很多情况下,智能终端使用MCU,且其显示设备是非标准接口的小型LCD。此时,必须找到占用较少资源的低成本实现方法。
笔者参加的智能终端项目就是一个比较典型的基于MCU的人机界面应用,使用128×64点阵式LCD模块,要求可显示Unicode编码的一、二级常用汉字库并可进行中文输入。此应用中输入法相关的代码和数据占用约20kB。在应用开发中,我们使用了实时操作系统μC/OS-II,相关内容可参考有关文献。
简单的中文拼音输入法
汉字输入法的实质是建立一种按键组合到汉字编码的映射关系,因此,使用数字键盘的嵌入式系统的输入法与使用标准键盘的PC机的输入法没有本质的不同,其区别主要在于嵌入式应用中处理器、存储器等资源比较有限。如对应汉字“你”,拼音输入法下PC键盘按键组合为“ni”,而在一般数字键盘下,其按键组合则为“64”。
在多数手持式设备(如智能电话)中,以0~9数字键与几个简单的控制键实现汉字输入,比较著名的是在手机中广泛采用的T9 和iTap 输入法。这里我们介绍一种简单的拼音输入法的实现方法。
一般终端键盘包括12个按键,分别是0~9数字键和“*”、“#”两个特殊键。按通用规则,数字1对应空格,其功能基本等同于PC机中的空格键,用于输入空格或作为当前汉字的确认键;2~9数字键分别对应下述汉语拼音字母:
2:a b c 3:d e f 4:g h i
5:j k l 6:m n o 7:p q r s
8:t u v 9:w x y z
而“0”、“*”、“#”键则作为输入法中的控制键。我们将“#”作为“选择键”,用于选取同一数字键组合下的不同拼音组合。
输入法中使用了两个重要数据结构,分别是PY_NODE和PY_SUBNODE。每个PY_NODE对应一个数字键组合,PY_SUBNODE则对应一组拼音组合。由于一个数字组合可对应多个拼音组合(如“226”对应“ban”、“bao”、“can ”、“cao”),因此这两个结构实现的是一个两级的对应表。
PY_NODE按树组织,而PY_SUBNODE按双向链表组织。二者的基本关系如图1所示。
以下是两个结构的定义:
typedef struct py_node{
unsigned int son[8]; //对应下次2~9按键输入时应转到的PY_NODE的ID号
unsigned int father; //父节点ID号
struct py_subnode *ptrpy; //指向下属第一个PY_SUBNODE的指针
}PY_NODE;
typedef rom struct py_subnode{
unsigned char py[7]; //本节点的拼音字符串
struct py_subnode *prev; //指向前一PY_SUBNODE的指针
struct py_subnode *next; //指向下一PY_SUBNODE的指针
unsigned char *ptrUnicode; //指向本节点对应Unicode码表的指针
}PY_SUBNODE;
设计中我们所参照的汉语拼音表中共有412种组合,这样系统中必须有412个PY_SUBNODE与其一一对应;系统中共建立了250个PY_NODE。建立此部分数据的工作比较繁琐,分以下5个步骤进行:
1、 汉字按拼音进行分组,按常用程度排序,并将汉字转化为Unicode码或国标码,码型视系统要求而定;
2、 将有效拼音转换为数字键盘值组合,如拼音“cui”转为数字值“284”,这些值对应了部分PY_NODE;
3、 增加中间PY_NODE,用于表示本身无效但后续输入有效的拼音,如“b”、“c”、“don”、“dua”等节点;
4、 将数字键组合相同的PY_SUBNODE编成链表,由某一PY_NODE中的ptrpy指针指向表头;
5、 按数字键组合的关系,将PY_NODE组成树。
图1中所示组织关系并不复杂,但其工作量不小,一般情况下可编写转换程序自动建立。图2为拼音输入法数据结构的一个片断。
在改变当前PY_NODE时,一般应伴有一些显示操作,因应用不同各有差异,此处不做过多说明。
在当前节点下,可以用某一指定控制键(如“#”键)来选择此PY_NODE下属的PY_SUBNODE以缩小汉字的选取范围。
增加功能
上述拼音输入法比较简单,且完成了输入法需要的基本功能。对于某些应用场合,对输入法还有更多的要求,可在上述方法的基础上进行改进实现。一些常见的要求和改进方法列举如下:
① 增加常用字功能
在上述输入法中,增加常用汉字。只考虑国标码中的约7000常用汉字情况下,输入法所占用的存储空间增加14kB。
② 增加联想功能
为使输入更为友好,很多输入法设有联想功能,即在输入一个汉字后,此汉字常用的后续汉字自动成为候选项由用户选择。
③ 笔划输入法
笔划输入法较之拼音输入法的优势在于重码少,输入不常用汉字时也不必多次翻页查找。
以五笔划输入法为例,通过五个按键即可输入汉字。该输入法将汉字笔划分为5种笔划,即:“一”、“丨”、“丿”、“丶”和“-”五种笔划,分别对应数字键“7”、“8”、“9”、“*”、“0”,如“你”字的组合为“丿”、“丨”、“丿”、“-”、“丨”、“丿”、“丶”。
笔划输入法与拼音输入法的区别在于人的感觉而非机器的操作,本质上只是按键组合与汉字码表对应关系有所不同,如“你”在拼音输入法下对应“64”,而在笔划输入法下则对应“989089*”。
④ 关于特殊符号、英文和数字
对于一些常用的特殊符号、英文和数字的输入,较常用的做法是将以单独的输入法实现。
软、硬件设计
输入法的性能优劣,更多的不是体现在算法,而是是否符合实际需求。因此它的优化工作是对前述PY_NODE和PY_SUBNODE组织的优化,如汉字次序的安排、联想功能中后序字的组织、以及操作界面的设计是否适合人们的使用习惯。因算法本身很简单,所以用C语言可实现较高的代码效率,以及较好的可移植性。
对于很多8位MCU,地址空间不大于64kB。这样小的空间对于汉字界面中的汉字库和输入法中的大量数据结构是远远不够的(如一、二级常用字的16×16点阵汉字库至少需要约220kB),因此常使用地址分页方式实现地址扩展。在MCU外部设一锁存器作为“页”寄存器,每页大小根据MCU特性和实际需求确定,如MCS51系列最大可为64kB一页。由于页寄存器的操作为独占型的,因此在中断内不能进行操作;而在基于RTOS的多任务环境下,应避免多个任务同时使用页寄存器。
结语
由于8位、16位MCU的应用场合多是低成本的设备,当商用输入法的成本无法接受或无法得到时,自行编写输入法应是可行的。当然,本文所讨论的只是实现输入法的基本方法,虽然方法可行,但所编写的输入法代码应经过较长时间的测试才可以作为产品的正式软件发布。
直接在Keil下仿真的T9拼音输入法(完整版)
作者:佚名 文章来源:侃单片机 点击数:1481 更新时间:2005-4-14
/*
看到论坛上有人发T9拼音输入法,好多人感兴趣啊!
呵呵,也把我很久以前的程序找出来重新编译了一下,
特点是直接在Keil下仿真,切换到串口窗口就可以直接看到结果。
希望大家喜欢哦
仿真步骤如下:
1、把3个帖子的内容分别保存为51t9py.c,51t9py_indexa.h,5py_mb.h,放在同一目录下,将51t9py.c加入工程编译
2、由于Keil的模拟串口是单字节显示,汉字显示为乱码,所以要加挂RICHWIN或RichView这种会重新刷新显示的中文平台,或手工刷新屏幕,所以请先到 http://www.pchome.net/dl/chinese.htm 下载RichView,安装运行
3、在Keil环境下可以直接按“Ctrl+F5”键仿真,按“F5”全速运行,切换到在串口依次输入: //
64*.6 426***.5 98*.7 936.3 586.1 4826*.1 9464*.7 64*.6试试:-)
4、按键对应(根据我自己的手机设置的,全部在PC的小键盘操作): //
Num /:上一拼音?*:下一拼音 //
7:pqrs 8:tuv 9:wxyz -:前翻页 //
4:ghi 5:jkl 6:mno +:后翻页 //
1:? 2:abc 3:def 回车键:输入状态和选字状态切换 //
0:? .和空格及回车键:输入状态和选字状态切换 //
*/
//请把这个帖子的内容保存为51t9py.c
//--------------------------------------------------------------------------//
// 源程序大公开 //
// (c) Copyright 2001-2003 xuwenjun //
// All Rights Reserved //
// V1.00 //
//--------------------------------------------------------------------------//
//标 题: T9拼音输入法模块 //
//文件名: 51t9py.c //
//版 本: V1.00 //
//修改人: 徐文军 E-mail:xuwenjun@21cn.com //
//日 期: 05-4-8 //
//描 述: T9拼音输入法模块 //
//声 明: //
// 以下代码仅免费提供给学习用途,但引用或修改后必须在文件中声明出处. //
// 如用于商业用途请与作者联系. E-mail:xuwenjun@21cn.com //
// 有问题请mailto xuwenjun@21cn.com 欢迎与我交流! //
//--------------------------------------------------------------------------//
//老版本: 无 老版本文件名: //
//创建人: 徐文军 E-mail:xuwenjun@21cn.com //
//日 期: 02-11-05 //
//描 述: //
// 1、很久以前的程序,根据网友张 凯、李 强的51py输入法子程序改编, //
// 增加索引、完善主程序、测试程序,使之在Keil下直接仿真 //
// 2、在Keil环境下可以直接按“Ctrl+F5”键仿真,切换到在串口依次输入: //
// 64*.6 426***.5 98*.7 936.3 586.1 4826*.1 9464*.7 64*.6试试:-) //
// 3、由于Keil的模拟串口是单字节显示,汉字显示为乱码,所以要加挂 //
// RICHWIN或RichView这种会重新刷新显示的中文平台,或手工刷新屏幕 //
// (RichView可以到 http://www.pchome.net/dl/chinese.htm 下载) //
// 4、按键对应(根据我自己的手机设置的,全部在PC的小键盘操作): //
// Num /:上一拼音?*:下一拼音 //
// 7:pqrs 8:tuv 9:wxyz -:前翻页 //
// 4:ghi 5:jkl 6:mno +:后翻页 //
// 1:? 2:abc 3:def 回车键:输入状态和选字状态切换 //
// 0:? .和空格及回车键:输入状态和选字状态切换 //
//--------------------------------------------------------------------------//
#include
#include
#include"PY_mb.h"
//#include"51t9_MB.h"
#include"51t9py_indexa.h"
#define CNTLQ 0x11
#define CNTLS 0x13
#define DEL 0x7F
#define BACKSPACE 0x08
#define CR 0x0D
#define LF 0x0A
unsigned char cpt9PY_Mblen;
struct t9PY_index code * cpt9PY_Mb[16];
unsigned char t9PY_ime(char *strInput_t9PY_str)
{
struct t9PY_index *cpHZ,*cpHZedge,*cpHZTemp;
unsigned char i,j,cInputStrLength;
cpt9PY_Mblen=0; //完全匹配组数
j=0; //j为匹配最大值
cInputStrLength=strlen(strInput_t9PY_str); //输入拼音串长度//
if(*strInput_t9PY_str=='/0')return(0); //如果输入空字符返回0//
cpHZ=&(t9PY_index2[0]); //查首字母索引//
cpHZedge=t9PY_index2+sizeof(t9PY_index2)/sizeof(t9PY_index2[0]);
// strInput_t9PY_str++; //指向拼音串第二个字母//
while(cpHZ < cpHZedge) //待查询记录条数
{
for(i=0;i
if(*(strInput_t9PY_str+i)!=*((*cpHZ).t9PY_T9+i)) //检查字符串匹配
{
if (i+1 > j)
{
j=i+1; //j为匹配最大值
cpHZTemp=cpHZ;
}
break; //发现字母串不配,退出//
}
}
if((i==cInputStrLength) && (cpt9PY_Mblen<16)) //字母串全配,最多8组
{
cpt9PY_Mb[cpt9PY_Mblen]=cpHZ;
cpt9PY_Mblen++;
}
cpHZ++;
}
if(j!=cInputStrLength) //不完全匹配输出最多匹配的1组
cpt9PY_Mb[0]=cpHZTemp;
return (cpt9PY_Mblen); //输出完全匹配组数,0为无果而终//
}
char * t9PY_ime_mb(char *strInput_t9PY_str)
{
if(t9PY_ime(strInput_t9PY_str) > 0)
return ((*(cpt9PY_Mb[0])).PY_mb);
else
return (PY_mb_space);
}
void t9PY_Test(void)
{
bit PYEnter=0;
bit HZok=0;
unsigned char temp;
// unsigned char temp2;
unsigned char t9PYn=0;
char idata inline[16]={0x00};
idata char chinese_word[3]=" ";
char tempchar,Add=0,i=0;
struct t9PY_index *cpTemp;
// cpTemp=t9PY_index2;
// printf ("/n按键 /:上一拼音 *:下一拼音 .和空格及回车键:输入状态和选字状态切换/n"); //
printf ("请按键:2-abc 3-def 4-ghi 5-jkl 6-mno 7-pqrs 8-tuv 9-wxyz /n"); //
while(!HZok)
{
tempchar=getchar();
switch (tempchar)
{
// case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
if (~PYEnter)
{
inline[i]=tempchar;
i++;
Add=0;
t9PY_ime(inline);
}
break;
case '/':
if (t9PYn >0) t9PYn --;
break;
case '*':
t9PYn ++;
if (t9PYn >=cpt9PY_Mblen) t9PYn --;
break;
case '-':
if (Add >= 12) Add -= 12;
break;
case '=':
case '+':
if (Add < strlen((*cpTemp).PY_mb) -12 )Add += 12;
break;
case BACKSPACE:
if (i>0) i--;
inline[i]=0x00;
Add=0;
t9PY_ime(inline);
// cpTemp=cpt9PY_Mb[t9PYn];
break;
// case '/n':
case '.': //输入状态和选字状态切换
case ' ':
case '/n':
PYEnter ^=1;
break;
default :
// HZok=1;
break;
}
printf (" /r");
if (PYEnter)
{
printf ("选");
cpTemp=cpt9PY_Mb[t9PYn];
if((cpTemp != PY_mb_space) && (tempchar>='1') && (tempchar<='9'))
{
HZok=1;
t9PYn=0;
printf (" /r");
// printf ("%s/n",inline);
chinese_word[0]=*((*cpTemp).PY_mb+Add+(tempchar-'1')*2);
chinese_word[1]=*((*cpTemp).PY_mb+Add+(tempchar-'1')*2+1);
printf (chinese_word);
printf ("/n");
}
else
{
// printf ((*(cpTemp)).PY);
printf (":");
printf ((*cpTemp).PY_mb+Add);
// printf ("/n拼音1 2 3 4 5 6 7 8 9/r");
}
}
else
{
printf ("拼");
for (temp=t9PYn;temp
cpTemp=cpt9PY_Mb[temp];
// temp2=((strlen((*(cpTemp)).PY_mb)-Add)/2);
// printf ("%2bd:%02bd:",temp,temp2);
printf (":");
printf ((*(cpTemp)).PY);
// printf ((*(cpTemp)).PY_mb+Add);
// printf ("/n");
}
// printf ("/n");
}
}
}
//-----以下为测试程序---------------------------------------------------------------------//
#include
#include
#ifdef MONITOR51 /* Debugging with Monitor-51 needs */
char code reserve [3] _at_ 0x23; /* space for serial interrupt if */
#endif /* Stop Exection with Serial Intr. */
/* is enabled */
void main (void) {
char input_string[]="98";
/*------------------------------------------------
Setup the serial port for 1200 baud at 16MHz.
------------------------------------------------*/
#ifndef MONITOR51
SCON = 0x50; /* SCON: mode 1, 8-bit UART, enable rcvr */
TMOD |= 0x20; /* TMOD: timer 1, mode 2, 8-bit reload */
TH1 = 250; /* TH1: reload value for 9600 baud @ 11.0592MHz */
TR1 = 1; /* TR1: timer 1 run */
TI = 1; /* TI: set TI to send first char of UART */
#endif
/*------------------------------------------------
Note that an embedded program never exits (because
there is no operating system to return to). It
must loop and execute forever.
------------------------------------------------*/
// printf ("Hello World/n"); /* Print "Hello World" */
printf ("/n");
printf ("%s/n",input_string);
printf (t9PY_ime_mb(input_string));
printf ("按键对应:(全部在PC的小键盘操作)/n");
printf (" /-上一拼音 *-下一拼音/n");
printf ("7-pqrs 8-tuv 9-wxyz --前翻页/n");
printf ("4-ghi 5-jkl 6-mno +-后翻页/n");
printf ("1-无效 2-abc 3-def 回车键-输入状态和选字状态切换/n");
printf ("0-无效 .和空格及回车键-输入状态和选字状态切换/n/n");
while(1)
{
t9PY_Test();
}
}
//请把这个帖子的内容保存为51t9py_indexa.h
//--------------------------------------------------------------------------//
// 源程序大公开 //
// (c) Copyright 2001-2003 xuwenjun //
// All Rights Reserved //
// V1.00 //
//--------------------------------------------------------------------------//
//标 题: T9拼音输入法索引 //
//文件名: 51t9py_indexa.h //
//版 本: V1.00 //
//修改人: 徐文军 E-mail:xuwenjun@21cn.com //
//日 期: 05-4-8 //
//描 述: T9拼音输入法索引 //
//声 明: //
// 以下代码仅免费提供给学习用途,但引用或修改后必须在文件中声明出处. //
// 如用于商业用途请与作者联系. E-mail: xuwenjun@21cn.com //
// 有问题请mailto xuwenjun@21cn.com 欢迎与我交流! //
//--------------------------------------------------------------------------//
//老版本: 无 老版本文件名: //
//创建人: 徐文军 E-mail:xuwenjun@21cn.com //
//日 期: 02-11-05 //
//描 述: //
//--------------------------------------------------------------------------//
struct t9PY_index
{
char code *t9PY_T9;
char code *PY;
char code *PY_mb;
};
/*"拼音输入法查询码表,T9数字字母索引表(index)"*/
struct t9PY_index code t9PY_index2[] ={
{"","",PY_mb_space},
{"2","a",PY_mb_a},
{"3","e",PY_mb_e},
{"4","i",PY_mb_space},
{"6","o",PY_mb_o},
{"8","u",PY_mb_space},
{"8","v",PY_mb_space},
{"24","ai",PY_mb_ai},
{"26","an",PY_mb_an},
{"26","ao",PY_mb_ao},
{"22","ba",PY_mb_ba},
{"24","bi",PY_mb_bi},
{"26","bo",PY_mb_bo},
{"28","bu",PY_mb_bu},
{"22","ca",PY_mb_ca},
{"23","ce",PY_mb_ce},
{"24","ci",PY_mb_ci},
{"28","cu",PY_mb_cu},
{"32","da",PY_mb_da},
{"33","de",PY_mb_de},
{"34","di",PY_mb_di},
{"38","du",PY_mb_du},
{"36","en",PY_mb_en},
{"37","er",PY_mb_er},
{"32","fa",PY_mb_fa},
{"36","fo",PY_mb_fo},
{"38","fu",PY_mb_fu},
{"42","ha",PY_mb_ha},
{"42","ga",PY_mb_ga},
{"43","ge",PY_mb_ge},
&nbs