zoukankan      html  css  js  c++  java
  • 字符编码的使用和转换

    字符编码的使用

    字符编码主要分两种:MBCS以及 Unicode。 以 C/CC++ 为例,以 char 为单位的数组使用MBCS编码(如 ASCII,GB2312,BIG5),以wchar_t 为单位的数组使用Unicode作为编码。

    比如你的程序中使用:
    char szTitle[] = "窗体标题“;
    此时,szTitle字符串使用的的是MBCS编码,如果用户的操作系统不是中文的Windows,你的程序将无法正常显示!

    所以,要换成Unicode方式:
    wchar_t szTitle[] = L"窗体标题";
    此时,szTitle字符串使用的的是Unicode编码,加入你的程序以unicode方式编译,在任何语言的Windows上都能显示正常。


    字符编码的转换

    有时候你从外部文件读进来的字符串是MBCS编码(如GB2312),而你程序里面都是统一用Unicode处理字符串,这时候要进行字符编码转换。 Windows为我们提供了很好用的API函数 MultiByteToWideChar WideCharToMultiByte 帮我们轻松实现转换。     代码如下:

    GB2312 转换成 Unicode:

    CODE:
    wchar_t* GB2312ToUnicode(const char* szGBString)
    {
               UINT nCodePage = 936; //GB2312
               int nLength=MultiByteToWideChar(nCodePage,0,szGBString,-1,NULL,0);
               wchar_t* pBuffer = new wchar_t[nLength+1];
               MultiByteToWideChar(nCodePage,0,szGBString,-1,pBuffer,nLength);
               pBuffer[nLength]=0;
               return pBuffer;
    }
    BIG5 转换成 Unicode:

    CODE:
    wchar_t* BIG5ToUnicode(const char* szBIG5String)
    {
               UINT nCodePage = 950; //BIG5
               int nLength=MultiByteToWideChar(nCodePage,0,szBIG5String,-1,NULL,0);
               wchar_t* pBuffer = new wchar_t[nLength+1];
               MultiByteToWideChar(nCodePage,0,szBIG5String,-1,pBuffer,nLength);
               pBuffer[nLength]=0;
               return pBuffer;
    }
    Unicode 转换成 GB2312:

    CODE:
    char* UnicodeToGB2312(const wchar_t* szUnicodeString)
    {
               UINT nCodePage = 936; //GB2312
               int nLength=WideCharToMultiByte(nCodePage,0,szUnicodeString,-1,NULL,0,NULL,NULL);
               char* pBuffer=new char[nLength+1];
               WideCharToMultiByte(nCodePage,0,szUnicodeString,-1,pBuffer,nLength,NULL,NULL);
               pBuffer[nLength]=0;
               return pBuffer;
    }
    Unicode 转换成 BIG5:

    CODE:
    char* UnicodeToBIG5(const wchar_t* szUnicodeString)
    {
               UINT nCodePage = 950; //BIG5
               int nLength=WideCharToMultiByte(nCodePage,0,szUnicodeString,-1,NULL,0,NULL,NULL);
               char* pBuffer=new char[nLength+1];
               WideCharToMultiByte(nCodePage,0,szUnicodeString,-1,pBuffer,nLength,NULL,NULL);
               pBuffer[nLength]=0;
               return pBuffer;
    }
    繁体和简体的相互转换

    利用Unicode作为媒介,还可以做出很有意思的应用。在处理中文过程中,一个经常用到的功能就是繁体和简体的互相转换。 代码如下:

    繁体中文BIG5 转换成 简体中文 GB2312

    CODE:
    char* BIG5ToGB2312(const char* szBIG5String)
    {
               LCID lcid = MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_CHINESE_PRC);

               wchar_t* szUnicodeBuff = BIG5ToUnicode(szBIG5String);
               char* szGB2312Buff = UnicodeToGB2312(szUnicodeBuff);

               int nLength = LCMapString(lcid,LCMAP_SIMPLIFIED_CHINESE, szGB2312Buff,-1,NULL,0);
               char* pBuffer = new char[nLength + 1];
               LCMapString(0x0804,LCMAP_SIMPLIFIED_CHINESE,szGB2312Buff,-1,pBuffer,nLength);
               pBuffer[nLength] = 0;
           
               delete[] szUnicodeBuff;
               delete[] szGB2312Buff;
               return pBuffer;
    }
    简体中文 GB2312 转换成 繁体中文BIG5

    CODE:
    char* GB2312ToBIG5(const char* szGBString)
    {
               LCID lcid = MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_CHINESE_PRC);

               int nLength = LCMapString(lcid,LCMAP_TRADITIONAL_CHINESE,szGBString,-1,NULL,0);
               char* pBuffer=new char[nLength+1];
               LCMapString(lcid,LCMAP_TRADITIONAL_CHINESE,szGBString,-1,pBuffer,nLength);
               pBuffer[nLength]=0;

               wchar_t* pUnicodeBuff = GB2312ToUnicode(pBuffer);
               char* pBIG5Buff = UnicodeToBIG5(pUnicodeBuff);

               delete[] pBuffer;
               delete[] pUnicodeBuff;
               return pBIG5Buff;
    }

    文本文件读写的编码问题

    当你的程序读一个文本文件时,如何判断文件中的字符是MBCS格式还是Unicode格式? Windows定义了一个"字节顺序标记"(Byte-order Mark)的概念:当一个txt文件的前2个字节为FF FE时,这个文件里面的字符采用Unicode编码, 如果没有字节顺序标记,就是MBCS编码。更多关于字节顺序标记的说明,请看 MSDN的官方资料

  • 相关阅读:
    mysql命令集锦
    linux 删除文件名带括号的文件
    linux下的cron定时任务
    struts2文件下载的实现
    贴一贴自己写的文件监控代码python
    Service Unavailable on IIS6 Win2003 x64
    'style.cssText' is null or not an object
    "the current fsmo could not be contacted" when change rid role
    远程激活程序
    新浪图片病毒
  • 原文地址:https://www.cnblogs.com/flying_bat/p/942647.html
Copyright © 2011-2022 走看看