获得汉字拼音首字母

简介: 原由一日上机玩的时候,一同学问起如何在C#中Console.ReadLine()[0]扑获的字符转化为Acsii码,后来解决拉不过我却留心起,那能不能用Acsii码的原理来扑获汉字的拼音呢?汉字...

原由

一日上机玩的时候,一同学问起如何在C#中Console.ReadLine()[0]扑获的字符转化为Acsii码,后来解决拉
不过我却留心起,那能不能用Acsii码的原理来扑获汉字的拼音呢?

汉字编码原理


汉字从哪里来的呢?是不是有个后台数据表,其中存放了所需要的所有汉字?
1980年,为了使每一个汉字有一个全国统一的代码,我国颁布了第一个汉字编码的国家标准: GB2312-80《信息交换用汉字编码字符集》基本集,简称GB2312,这个字符集是我国中文信息处理技术的发展基础,也是国内所有汉字系统的统一标准。到了后来又公布了国家标准GB18030-2000《信息交换用汉字编码字符集基本集的扩充》,简称GB18030,编程时如果涉及到编码和本地化的朋友应该对GB18030很熟悉。这是是我国继GB2312-1980和GB13000-1993之后最重要的汉字编码标准,同时也是未来我国计算机系统必须遵循的基础性标准之一。
目前在中文WINDOWS操作系统中,.NET编程中默认的的代码页就是GB18030简体中文。但是事实上如果生成中文汉字验证码只须要使用GB2312字符集就已经足够了。字符集中除了我们平时大家都认识的汉字外,也包含了很多我们不认识平时也很少见到的汉字。如果生成中文汉字验证码中有很多我们不认识的汉字让我们输入,对于使用拼音输入法的朋友来说可不是好事,五笔使用者还能勉强根据汉字的长相打出来,呵呵!所以对于GB2312字符集中的汉字我们也不是全都要用
中文汉字字符可以使用区位码来表示.
有兴趣的可以去看看这里:
http://www.lianping.gov.cn/zhaofang/computer/office/gb2312.htm

汉字从哪里来的呢?是不是有个后台数据表,其中存放了所需要的所有汉字?
1980年,为了使每一个汉字有一个全国统一的代码,我国颁布了第一个汉字编码的国家标准: GB2312-80《信息交换用汉字编码字符集》基本集,简称GB2312,这个字符集是我国中文信息处理技术的发展基础,也是国内所有汉字系统的统一标准。到了后来又公布了国家标准GB18030-2000《信息交换用汉字编码字符集基本集的扩充》,简称GB18030,编程时如果涉及到编码和本地化的朋友应该对GB18030很熟悉。这是是我国继GB2312-1980和GB13000-1993之后最重要的汉字编码标准,同时也是未来我国计算机系统必须遵循的基础性标准之一。
目前在中文WINDOWS操作系统中,.NET编程中默认的的代码页就是GB18030简体中文。但是事实上如果生成中文汉字验证码只须要使用GB2312字符集就已经足够了。字符集中除了我们平时大家都认识的汉字外,也包含了很多我们不认识平时也很少见到的汉字。如果生成中文汉字验证码中有很多我们不认识的汉字让我们输入,对于使用拼音输入法的朋友来说可不是好事,五笔使用者还能勉强根据汉字的长相打出来,呵呵!所以对于GB2312字符集中的汉字我们也不是全都要用
中文汉字字符可以使用区位码来表示.
有兴趣的可以去看看这里:
http://www.lianping.gov.cn/zhaofang/computer/office/gb2312.htm

Net程序处理汉字编码原理分析

在.Net中可以使用System.Text来处理所有语言的编码。在System.Text命名空间中包含众多编码的类,可供进行操作及转换。其中的Encoding类就是重点处理汉字编码的类。通过在.NET文档中查询Encoding类的方法我们可以发现所有和文字编码有关的都是字节数组,其中有两个很好用的方法:


Encoding.GetBytes ()方法将指定的 String 或字符数组的全部或部分内容编码为字节数组
Encoding.GetString ()方法将指定字节数组解码为字符串。

没错我们可以通过这两个方法将汉字字符编码为字节数组,同样知道了汉字GB2312的字节数组编码也就可以将字节数组解码为汉字字符。通过对“好”字进行编码为字节数组后


Encoding gb=System.Text.Encoding.GetEncoding("gb2312");
object[] bytes=gb.Encoding.GetBytes ("好");

发现得到了一个长度为2的字节数组bytes,使用


string lowCode = System.Convert.ToString(bytes[0], 16); //取出元素1编码内容(两位16进制)
string hightCode = System.Convert.ToString(bytes[1], 16);//取出元素2编码内容(两位16进制)

 

代码

新建一类文件ChineseCodning.cs

//------------------------------------------------------------------------------
//
//     This code was generated by SharpDevelop.
//     Runtime Version: 1.1.4322.573
//
//     作者:张健滢
//     时间:2005/12/17
//
//------------------------------------------------------------------------------

namespace Demo {
   
using System;
   
using System.Text;
   
   
///
   
/// 中文编码类
   
/// 获得拼音首字母
   
///
   
///
   
///     created by - 张健滢
   
///     created on - 2005-12-17 21:43:01
   
///
    public sealed class ChineseCodning : object {
       
       
///
       
/// 空构造函数
       
///
       
///
        public ChineseCodning(){

        }
       
       

       
public char getPinYin(string Source){
           
int keyNumber=getCodeNumber(Source);
           
           
if (keyNumber>=getCodeNumber("") && keyNumber<=getCodeNumber(""))
               
return 'a';
           
else if (keyNumber>=getCodeNumber("") && keyNumber<=getCodeNumber(""))
               
return 'b';
           
else if (keyNumber>=getCodeNumber("") && keyNumber<=getCodeNumber(""))
               
return 'c';
           
else if (keyNumber>=getCodeNumber("") && keyNumber<=getCodeNumber(""))
               
return 'd';
           
else if (keyNumber>=getCodeNumber("") && keyNumber<=getCodeNumber(""))
               
return 'e';
           
else if (keyNumber>=getCodeNumber("") && keyNumber<=getCodeNumber(""))
               
return 'f';
           
else if (keyNumber>=getCodeNumber("") && keyNumber<=getCodeNumber(""))
               
return 'g';
           
else if (keyNumber>=getCodeNumber("") && keyNumber<=getCodeNumber(""))
               
return 'h';
           
else if (keyNumber>=getCodeNumber("") && keyNumber<=getCodeNumber(""))
               
return 'j';
           
else if (keyNumber>=getCodeNumber("") && keyNumber<=getCodeNumber(""))
               
return 'k';
           
else if (keyNumber>=getCodeNumber("") && keyNumber<=getCodeNumber(""))
               
return 'l';
           
else if (keyNumber>=getCodeNumber("") && keyNumber<=getCodeNumber(""))
               
return 'm';
           
else if (keyNumber>=getCodeNumber("") && keyNumber<=getCodeNumber(""))
               
return 'n';
           
else if (keyNumber>=getCodeNumber("") && keyNumber<=getCodeNumber(""))
               
return 'o';
           
else if (keyNumber>=getCodeNumber("") && keyNumber<=getCodeNumber(""))
               
return 'p';
           
else if (keyNumber>=getCodeNumber("") && keyNumber<=getCodeNumber(""))
               
return 'q';
           
else if (keyNumber>=getCodeNumber("") && keyNumber<=getCodeNumber(""))
               
return 'r';
           
else if (keyNumber>=getCodeNumber("") && keyNumber<=getCodeNumber(""))
               
return 's';
           
else if (keyNumber>=getCodeNumber("") && keyNumber<=getCodeNumber(""))
               
return 't';
           
else if (keyNumber>=getCodeNumber("") && keyNumber<=getCodeNumber(""))
               
return 'w';
           
else if (keyNumber>=getCodeNumber("") && keyNumber<=getCodeNumber(""))
               
return 'x';
           
else if (keyNumber>=getCodeNumber("") && keyNumber<=getCodeNumber(""))
               
return 'y';
           
else if (keyNumber>=getCodeNumber("") && keyNumber<=getCodeNumber(""))
               
return 'z';

           
return '*';
        }




       
///
       
/// 获得16进制编码
       
///
       
/// 返回汉字16进制区位码
        public string getHexEncoding(string Source){ isChinese(Source); Encoding gb=System.Text.Encoding.GetEncoding("gb2312");
           
byte[] bytes=gb.GetBytes (Source);   
           
string lowCode = System.Convert.ToString(bytes[0],16);   
           
string hightCode = System.Convert.ToString(bytes[1],16);           
           
return lowCode+hightCode;
        }   

       
       
///
       
/// 获得中国汉字的对应16进制区位码的整数值
       
///
       
/// 16进制区位码的整数值
        private static int getCodeNumber(string Source){
            ChineseCodning target
=new ChineseCodning();           
           
return Convert.ToInt32(target.getHexEncoding(Source),16);
        }   



       
///
       
/// 判断是否是中国汉字
       
///
       
///
        private static void isChinese(string Source){
           
           
//判断string长度
            if (Source.Length!=1)
               
throw new Exception("输入过多或不够,请保证只要输入一个汉字");
               
           
            Encoding gb
=System.Text.UTF8Encoding.GetEncoding("gb2312");
           
byte[] bytes=gb.GetBytes (Source);
           
//判断是否是双字节
            if (bytes.Length!=2)
               
throw new Exception("输入过多或不够,请保证只要输入一个汉字");
               
           
           
//判断汉字的范围是否是符合GB2312-80区位编码规范
            string lowCode = System.Convert.ToString(bytes[0],16);   
           
string hightCode = System.Convert.ToString(bytes[1],16);
           
int k= Convert.ToInt32(lowCode+hightCode,16);
            ChineseCodning traget
= new ChineseCodning();
           
if (k<45217 || k>55289 )
               
throw new Exception("输入的汉字不符合GB2312-80区位编码规范");   
           
           
        }

       

       

    }
}

在主函数中如此调用:

public static void Main(string[] args)
        {

        ChineseCodning c
=new ChineseCodning();
        Console.WriteLine(c.getPinYin(
""));
       
//获得区位码
        Console.WriteLine(c.getHexEncoding(""));
        Console.WriteLine(c.getPinYin(
""));
        Console.WriteLine(c.getPinYin(
""));
       
//"滢"字不在GB2312-80规范之内
        try{
        Console.WriteLine(c.getPinYin(
""));
        }
catch(Exception e)
        {
            Console.WriteLine(
"出错:/"滢/"字不在GB2312-80规范之内");
        }       

        
        }

暂时我还没有找到扩充字符的资料,所以有一部分字无法查到,不过没关系!

 

目录
相关文章
带声调的拼音字符比较特殊
带声调的拼音字符比较特殊
97 0
|
数据库
轻松解决汉字和拼音转换问题!!
轻松解决汉字和拼音转换问题!!
157 0
pinyin4j:获取中文串拼音或拼音首字母
pinyin4j:获取中文串拼音或拼音首字母
279 0
C# 获取汉字拼音首字母
最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来。 十年河东十年河西,莫欺少年穷 学无止境,精益求精   本节探讨C#获取汉字拼音首字母的方法: 代码类东西,直接上代码: /// /// 在指定的字符串列表CnStr中检...
3202 0