zoukankan      html  css  js  c++  java
  • vc 文字转换到机内码,输入汉字和数字, 输出一串16进制码(数字-〉ASII码,汉字—〉国标码)

        // 可以用,此程序实现的是是文字转换到机内码。机内码=国标码+8080H,不过学习了。
    
        //此程序是利用汉字在机器内输出就是机内码的原理,直接保存的,其实挺简单.
        //输入一串汉字和数字的混合字符, 经过程序转换, 对应输出一串16进制码(数字-〉ASII码,汉字—〉国标码)
        CString temp;
        GetDlgItemText(IDC_EDIT1,m_hanzi);//将汉字保存到变量m_hanzi
    
        unsigned char *b=new unsigned char[m_hanzi.GetLength()+1];//新建无符号字符 数组,赋值给无符号字符指针b 
    
        memcpy(b,m_hanzi,m_hanzi.GetLength());//m_hanzi中的汉字字符  复制到字符指针b中(内存中)
    
        for(int i=0;i<m_hanzi.GetLength();i++) //一个字符一个字符进行转换  ( 汉字的长度 )
        {
            m_shuzi.Format(" %x", b[i]);//内存中的机器码字符用十六进制显示
            temp=temp+m_shuzi;//文本框中显示
        }
    
        m_shu.SetWindowText(temp);//
        delete(b);//删除字符指针b 

    vc/c++中的英文字符仍然采用ASCII编码方式。可以设想,其他国家程序员利用vc/c++编写程序输入本国字符时,vc/c++则会采用该国的字符编码方式来处理这些字符。

    我个人猜测,vc安装程序中应该带有不同国家的内码库,这样一来肯定会占用很大的空间。

    2.VC中汉字的编码方式

    vc/c++正是采用了GB2312内部码作为汉字的编码方式,因此vc/c++中的各种输入输出方法,如cin/wcin,cout /wcout,scanf/wsanf,printf/wprintf...都是基于GB2312的,如果汉字的内码不是这种编码方式,那么利用上述各种 方法就不会正确的解析汉字。

    可以用下面的Demo程序来模拟vc/c++中输出汉字字符的过程。

     

     unsigned char input[50];
    
    cin>>input;
    
        int flag=0;
    
        for(int i =0 ;i < 50 ;i++)
    
        {
    
           if(input[i] > 0xa0 && input[i] != 0)
    
           {
    
               if(flag == 1)
    
               {
    
                  cout<<"chinese character"<<endl;
    
                  flag = 0;
    
               }
    
               else
    
               {
    
                  flag++;
    
               }
    
           }
    
           else if(input[i] == 0)
    
           {
    
               break;
    
           }
    
           else
    
           {
    
               cout<<"english character"<<endl;
    
           }
    
    }

     

    输入:Hello中国 (“中国”对应的GB2312内码为:214 208,185 250)

    输出:english character

    english character

    english character

    english character

    english character

    chinese character

    chinese character

    Java与C#语言都是采用Unicode编码方式,在这两种语言中定义一个字符,在内存中存放的就是这个字符的两字节Unicode码。如下所示:

    char a='我';    => 内存中存放的Unicode码为:25105

    ----

    上面unsigned char input[50] ,这属于声明了Unicode编码格式,所以你后面的那句话“问题又产生了”,没有任何意义。我个人的看法

    VC中的汉字编码

    转载自:http://m.blog.csdn.net/blog/wwxl1986622/7227266

    vc/c++中的英文字符仍然采用ASCII编码方式。可以设想,其他国家程序员利用vc/c++编写程序输入本国字符时,vc/c++则会采用该国的字符编码方式来处理这些字符。

    我个人猜测,vc安装程序中应该带有不同国家的内码库,这样一来肯定会占用很大的空间。

    二 解决引入问题所需的知识

       主要需两方面的知识,第一个为字符尤其是汉字的编码,以及语言和工具的支持情况,第二个是vc/c++中MutiByte Charater Set 和 Wide Character Set有关内存分配的情况。

    三 汉字的编码方式及在vc/c++中的处理

    1.汉字编码方式的介绍

    对英文字符的处理,7位ASCII码字符集中的字符即可满足使用需求,且英文字符在计算机上的输入及输出也非常简单,因此,英文字符的输入、存储、内部处理和输出都可以只用同一个编码(如ASCII码)。

    而汉字是一种象形文字,字数极多(现代汉字中仅常用字就有六、七千个,总字数高达5万个以上),且字形复杂,每一个汉字都有"音、形、义"三要素, 同音字、异体字也很多,这些都给汉字的的计算机处理带来了很大的困难。要在计算机中处理汉字,必须解决以下几个问题:首先是汉字的输入,即如何把结构复杂 的方块汉字输入到计算机中去,这是汉字处理的关键;其次,汉字在计算机内如何表示和存储?如何与西文兼容?最后,如何将汉字的处理结果从计算机内输出?

    为此,必须将汉字代码化,即对汉字进行编码。对应于上述汉字处理过程中的输入、内部处理及输出这三个主要环节,每一个汉字的编码都包括输入码、交换码、内部码和字形码。在计算机的汉字信息处理系统中,处理汉字时要进行如下的代码转换:输入码→交换码→内部码→字形码。

    (1)输入码: 作用是,利用它和现有的标准西文键盘结合来输入汉字。输入码也称为外码。主要归为四类:

    a)      数字编码:数字编码是用等长的数字串为汉字逐一编号,以这个编号作为汉字的输入码。例如,区位码、电报码等都属于数字编码。

    b)      拼音码:拼音码是以汉字的读音为基础的输入办法。

    c)      字形码:字形码是以汉字的字形结构为基础的输入编码。例如,五笔字型码(王码)。

    d)      音形码:音形码是兼顾汉字的读音和字形的输入编码。

    (2)交换码:用于汉字外码和内部码的交换。交换码的国家标准代号为GB2312-80。

    (3)内部码:内部码是汉字在计算机内的基本表示形式,是计算机对汉字进行识别、存储、处理和传输所用的编码。内部码也是双字节编码,将国标码两个字节的最高位都置为"1",即转换成汉字的内部码。

    (4)字形码:字形码是表示汉字字形信息(汉字的结构、形状、笔划等)的编码,用来实现计算机对汉字的输出(显示、打印)。

    2.VC中汉字的编码方式

    vc/c++正是采用了GB2312内部码作为汉字的编码方式,因此vc/c++中的各种输入输出方法,如cin/wcin,cout /wcout,scanf/wsanf,printf/wprintf...都是基于GB2312的,如果汉字的内码不是这种编码方式,那么利用上述各种 方法就不会正确的解析汉字。

    仔细观察ASCII字符表,从第161个字符开始,后面的字符并不经常为用户所使用,负值也未使用。GB2312编码方式充分利用这一特性,将 161-255(-95~-1)之间的数值空间作为汉字的标识码。既然255-161 = 94不能满足汉字容量的要求,就将每两个字符并在一块(即一个汉字占两个字节),显然,94* 94 =8836基本上已经满足了常用汉字个数的要求。计算机处理字符时,当连续处理到两个大与160(或-95~-1)的字节时,就认为这两个字节存放了一个 汉字字符。可以用下面的Demo程序来模拟vc/c++中输出汉字字符的过程。

       unsigned char input[50];

    cin>>input;

        int flag=0;

        for(int i =0 ;i < 50 ;i++)

        {

           if(input[i] > 0xa0 && input[i] != 0)

           {

               if(flag == 1)

               {

                  cout<<"chinese character"<<endl;

                  flag = 0;

               }

               else

               {

                  flag++;

               }

           }

           else if(input[i] == 0)

           {

               break;

           }

           else

           {

               cout<<"english character"<<endl;

           }

    }

    输入:Hello中国 (“中国”对应的GB2312内码为:214 208,185 250)

    输出:english character

    english character

    english character

    english character

    english character

    chinese character

    chinese character

    3.新的内码标准---Unicode

    Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语 言、跨平台进行文本转换、处理的要求。1990年开始研发,1994年正式公布。随着计算机工作能力的增强,Unicode也在面世以来的十多年里得到普 及。最新版本的 Unicode 是 2005年3月31日推出的Unicode 4.1.0 。另外,5.0 Beta已于2005年12月12日推出,以供各会员评价。

    Unicode 编码系统可分为编码方式和实现方式两个层次。

    编码方式:Unicode 的编码方式与 ISO 10646 的通用字符集(Universal Character Set,UCS)概念相对应,目前的用于实用的 Unicode 版本对应于 UCS-2,使用16位的编码空间。也就是每个字符占用2个字节。这样理论上一共最多可以表示 216 个字符。基本满足各种语言的使用。实际上目前版本的 Unicode 尚未填充满这16位编码,保留了大量空间作为特殊使用或将来扩展。

    实现方式:Unicode 的实现方式不同于编码方式。一个字符的 Unicode 编码是确定的。但是在实际传输过程中,由于不同系统平台的设计不一定一致,以及出于节省空间的目的,对 Unicode 编码的实现方式有所不同。Unicode 的实现方式称为Unicode转换格式(Unicode Translation Format,简称为 UTF)。如,UTF-8 编码,这是一种变长编码,它将基本7位ASCII字符仍用7位编码表示,占用一个字节(首位补0)。而遇到与其他 Unicode 字符混合的情况,将按一定算法转换,每个字符使用1-3个字节编码,并利用首位为0或1进行识别。

    Java与C#语言都是采用Unicode编码方式,在这两种语言中定义一个字符,在内存中存放的就是这个字符的两字节Unicode码。如下所示:

    char a='我';    => 内存中存放的Unicode码为:25105

    ----

    上面unsigned char input[50] ,这属于声明了Unicode编码格式,所以你后面的那句话“问题又产生了”,没有任何意义。我个人的看法

     

    发现自己的不足,善于利用找到的方法去扬长避短。行动起来。
  • 相关阅读:
    【转】VS2010中 C++创建DLL图解
    [转]error: 'retainCount' is unavailable: not available in automatic reference counting mode
    [转]关于NSAutoreleasePool' is unavailable: not available in automatic reference counting mode的解决方法
    【转】 Tomcat v7.0 Server at localhost was unable to start within 45
    【转】Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds. If
    【转】SVN管理多个项目版本库
    【转】eclipse安装SVN插件的两种方法
    【转】MYSQL启用日志,和查看日志
    【转】Repository has not been enabled to accept revision propchanges
    【转】SVN库的迁移
  • 原文地址:https://www.cnblogs.com/rechen/p/5097337.html
Copyright © 2011-2022 走看看