怎么样使用数字键盘输入法?
怎么样使用数字键盘输入法?
是否还记得去年流行的一个“神秘”的小把戏?就是在MSN、QQ之类的IM工具的消息输入框里,按下键盘上的ALT键,然后在键盘的数字区域打入29482,然后再松开ALT键,然后一个“猪”字就崩了出来?当时有好几个人发了mail告诉我这个小把戏,我马上有了兴趣,于是查了点资料想解开背后的原因。然后用JAVA写了个小程序,输入一个字符串,然后输出这种神秘输入法的“编码”。今天重新翻了出来,改写成了C#版。
事实上,很容易知道,29482就是“猪”字的UNICODE编码的十进制值,十六进制值是/u
当然,如果光是UNICODE编码,就太没有意思了,于是还顺便做了扩展ASCII编码的获取方法,当然是针对汉字gb2312编码的,这也是简体中文系统的默认编码。这种“输入法”其实跟IM工具毫无关系,似乎就是操作系统开放的一个功能,只是大家没察觉而已,之所以网上流行的说法都是MSN、QQ里输入,是因为这两个工具的字符存储是UNICODE的,所以,事实上所有UNICODE存储的软件都可以用这种输入法,比如MS Office Word,比如以UNICODE存储方式运行的记事本程序(Windows记事本默认是以ASCII编码存储的,但可以用另存为,选择一种字符编码)。那么,对于ASCII编码呢?其实找到了ASCII编码,一样可以使用这种方式输入,双字节语言比如汉语、日语、韩语都可以用扩展ASCII编码存储,都容易获取其编码。
好了,不多说了,直接贴代码了,程序很短,也没什么难点,简单说明一下WordDecode类,用一个UNICODE字符构造该类的实例,然后用属性直接获取到相应的编码。
///字符编码获取
///</summary>
classWordDecode
{
privatebytehighByteUni;
privatebytelowByteUni;
privatebytehighByteEAscii;
privatebytelowByteEAscii;
privatestaticEncodingeeas=System.Text.ASCIIEncoding.GetEncoding("gb2312");
privatestaticEncodingeuni=System.Text.UnicodeEncoding.Unicode;
publicbyteHighByteUni
{
get{returnhighByteUni;}
set{highByteUni=value;}
}
publicbyteLowByteUni
{
get{returnlowByteUni;}
set{lowByteUni=value;}
}
///<summary>
///Unicode编码十六进制形式
///</summary>
publicstringUnicodeAsHex
{
get
{
if(highByteUni!=0)
returnString.Format("/u{0:X}{1:X}",highByteUni,lowByteUni);
returnString.Format("/u{0:X}",lowByteUni);
}
}
publicbyteHighByteEAscii
{
get{returnhighByteEAscii;}
set{highByteEAscii=value;}
}
publicbyteLowByteEAscii
{
get{returnlowByteEAscii;}
set{lowByteEAscii=value;}
}
///<summary>
///EAscii编码十六进制形式(gb2312)
///</summary>
publicstringEAsciiAsHex
{
get
{
if(highByteEAscii!=0)
returnString.Format("/0x{0:X}{1:X}",lowByteEAscii,highByteEAscii);
returnString.Format("/0x{0:X}",lowByteEAscii);
}
}
///<summary>
///数字键盘Unicode编码的十进制值
///</summary>
publicstringKeyboardNumAreaUnicodeValue
{
//20013->78(High)45(Low)
//100111000101101
//就是"中"字
get
{
intu=0;
u|=this.highByteUni;
u<<=8;
u|=this.lowByteUni;
returnu.ToString();
}
}
///<summary>
///数字键盘EAscii编码的十进制值(gb2312)
///</summary>
publicstringKeyboardNumAreaEAsciiValue
{
//54992->208(High)214(low)
//1101000011010110
//就是"中"字
get
{
intu=0;
u|=this.lowByteEAscii;
u<<=8;
u|=this.highByteEAscii;
returnu.ToString();
}
}
///<summary>
///原字符(Unicode编码)
///</summary>
publicCharCharacterUni
{
get
{
returneuni.GetChars(newbyte[]{this.lowByteUni,this.highByteUni})[0];
}
}
///<summary>
///构造函数
///</summary>
///<paramname="uniChar">一个16位宽字符</param>
publicWordDecode(charuniChar)
{
byte[]bsUni=euni.GetBytes(newchar[]{uniChar});
this.highByteUni=bsUni[1];
this.lowByteUni=bsUni[0];