字符编码的使用和转换

转载 2006年06月04日 11:43:00
《WinHack的开发技术经验(1)-使用 Unicode 作为内部字符串处理》 里面讲到了应该使用Unicode作为程序里字符串编码, 本文进一步讲如何使用和转换编码。

字符编码的使用

字符编码主要分两种: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:

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:

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:

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:

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

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

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的官方资料

转自http://hingman.cnblogs.com/

 

 

【转】Mysql中校对集utf8_unicode_ci与utf8_general_ci的区别

转载自:http://hi.baidu.com/limingdai/blog/item/ae5878979218286554fb9601.html一直对utf8_unicode_ci与utf8_gen...
  • lxbin
  • lxbin
  • 2009年03月23日 11:43
  • 1120

文件编码与字符编码

文件编码与字符编码首先明确一点,文件不存在什么编码(归根结底文件都是二进制文件,用ue打开可以看到都是一个个的16进制数),只有文件中的字符才可以说编码。编码与解码过程字符通过某种编码组织起来存到文件...
  • sun_abc
  • sun_abc
  • 2010年05月14日 13:47
  • 3871

字符编码的使用和转换(zhuan)

字符编码的使用字符编码主要分两种:MBCS以及 Unicode。 以 C/CC++ 为例,以 char 为单位的数组使用MBCS编码(如 ASCII,GB2312,BIG5),以wchar_t 为单位...
  • aikker
  • aikker
  • 2008年05月22日 15:46
  • 315

C语言编码与字符转换

c语言支持的字符编码 多字节字符编码:用一个字节表示数字、字母,用多个字节表示其它字符(汉字两个字节)。字符长度定义:一个字节为一个字符长度。 宽字节字符编码(UNICODE):全部用两个字节表示...
  • rankun1
  • rankun1
  • 2016年03月03日 10:17
  • 3408

提交服务器请求中文字符乱码,需要进行编码转换

import java.io.UnsupportedEncodingException;    /**  * 转换字符串的编码  */  public class ChangeCharset {   ...
  • huningjun
  • huningjun
  • 2018年01月11日 18:34
  • 42

文本文件转换字符编码(UTF-8等)的通用方法

困扰我半年的问题居然是这种解决的办法www
  • u014599496
  • u014599496
  • 2017年07月18日 11:25
  • 424

使用c++11标准库转换字符编码

#include #include #include const std::string ws2s( const std::wstring& src ) { std::locale sys_...
  • MaxWoods
  • MaxWoods
  • 2014年10月27日 14:15
  • 869

字符编码之间的转换

字符编码介绍 在严格的ASCII中,每个字元用7位元表示,一共规定了128个字符的编码; Unicode拓展自ASCII字元集,使用全16位字元集,可以表示全世界上所有的书写语言中可能用于电脑通讯...
  • daoming1112
  • daoming1112
  • 2016年12月27日 23:31
  • 202

字符编码的转换iconv

要点:1、应用程序的iconv:采用命令行界面,允许将某种特定编码的文件转换为另一种编码;             2、编程接口的iconv:包括3个函数 (具体使用man iconv 和man 3 ...
  • deggfg
  • deggfg
  • 2014年03月19日 12:59
  • 173

关于JSP/Servlet字符编码

首先,来说一下HTML和JSP的区别: HTML属于前台,纯展示页面,请求HTML时,容器(如Tomcat)会读取HTML文件的内容,通过socket遵循HTTP协议发送到浏览器; JSP属于后台,请...
  • xuefeng0707
  • xuefeng0707
  • 2014年04月06日 00:56
  • 4526
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:字符编码的使用和转换
举报原因:
原因补充:

(最多只允许输入30个字)