字符编码转换

原创 2011年01月13日 16:00:00

继续编码转换

      Unicode 有两套编码集,UCS-2 和 UCS-4。Windows 的内部其实是用的 UCS-2 标准,并用 UTF-16 来实现。而非 Windows 系统大多采用了 UTF-8 实现。

      大家都知道在windows上wchar_t是2个字节表示,而在Linux上wchar_t是4个字节表示的。这样写跨平台的程序时,就会不统一。

下面是我用到的几个函数,wchar_t与UTF-8编码之间的转换和UTF-16和wchar_t之间的转换。

view plaincopy to clipboardprint?
#ifdef WINDOWS  
 
#include <windows.h>  
 
#include <stdio.h>  
 
#include <ctype.h>  
 
#else  
 
#include <iconv.h>  
 
#include <wctype.h>  
#include <wchar.h>  
#include <errno.h>  
 
#endif  
 
   
 
      
//wchar_t转成UTF-8  
int FW2UTF8Convert( const wchar_t* a_szSrc, int a_nSrcSize, char* a_szDest, int a_nDestSize )  
{  
#ifdef WINDOWS  
 return WideCharToMultiByte( CP_UTF8, 0, a_szSrc, -1, a_szDest, a_nDestSize, NULL, NULL );  
#else  
 size_t result;  
 iconv_t env;  
 env = iconv_open("UTF-8","WCHAR_T");  
 if (env==(iconv_t)-1)  
 {  
  printf("iconv_open WCHAR_T->UTF8 error%s %d/n",strerror(errno),errno) ;  
  return -1;  
 }  
 result = iconv(env,(char**)&a_szSrc,(size_t*)&a_nSrcSize,(char**)&a_szDest,(size_t*)&a_nDestSize);  
 if (result==(size_t)-1)  
 {  
  printf("iconv WCHAR_T->UTF8 error %d/n",errno) ;  
  return -1;  
 }  
 iconv_close(env);  
 return (int)result;  
#endif  
}  
 
   
 
   
 
//UTF-8转成wchar_t  
int FUTF82WConvert( const char* a_szSrc, wchar_t* a_szDest, int a_nDestSize )  
{  
#ifdef WINDOWS  
 return MultiByteToWideChar( CP_UTF8, 0, a_szSrc, -1, a_szDest, a_nDestSize );  
#else  
 size_t result;  
 iconv_t env;  
 int size = strlen(a_szSrc)+1 ;  
 env = iconv_open("WCHAR_T","UTF-8");  
 if (env==(iconv_t)-1)  
 {  
  printf("iconv_open UTF8->WCHAR_T error %d/n",errno) ;  
  return -1;  
 }  
 result = iconv(env,(char**)&a_szSrc,(size_t*)&size,(char**)&a_szDest,(size_t*)&a_nDestSize);  
 if (result==(size_t)-1)  
 {  
  printf("iconv UTF8->WCHAR_T error %d/n",errno) ;  
  return -1;  
 }  
 iconv_close(env);  
 return (int)result;  
#endif  
}  
 
   
 
   
 
//wchar_t转成utf16  
int FW2UConvert( const wchar_t* a_szSrc, int  a_nSize,char* a_szDest, int a_nDestSize )  
{  
#ifdef WINDOWS  
 memcpy_s((wchar_t*)a_szDest,a_nDestSize,a_szSrc,a_nSize);  
 return a_nSize ;  
#else  
 size_t result;  
 iconv_t env;  
 env = iconv_open("UCS-2-INTERNAL","UCS-4-INTERNAL");  
 if (env==(iconv_t)-1)  
 {  
  printf("iconv_open WCHAR_T->UTF16 error%s %d/n", strerror(errno),errno);  
  return -1;  
 }  
 result = iconv(env,(char**)&a_szSrc,(size_t*)&a_nSize,(char**)&a_szDest,(size_t*)&a_nDestSize);  
 if (result==(size_t)-1)  
 {  
  printf("iconv WCHAR_T->UTF16 error %s %d/n", strerror(errno), errno);  
  return -1;  
 }  
 iconv_close(env);  
 return (int)result;  
#endif  
}  
 
   
 
   
 
//utf16转成wchar_t  
int FU2WConvert( const  char* a_szSrc, int a_nSize, wchar_t* a_szDest, int a_nDestSize )  
{  
#ifdef WINDOWS  
 memcpy_s(a_szDest,a_nDestSize,(const wchar_t*)a_szSrc,a_nSize);  
 return a_nSize ;  
#else  
 size_t result;  
 iconv_t env;  
 env = iconv_open("UCS-4-INTERNAL","UCS-2-INTERNAL");  
 if (env==(iconv_t)-1)  
 {  
  printf("iconv_open error %d/n",errno) ;  
  return -1;  
 }  
 result = iconv(env,(char**)&a_szSrc,(size_t*)&a_nSize,(char**)&a_szDest,(size_t*)&a_nDestSize);  
 if (result==(size_t)-1)  
 {  
  printf("UTF16 -> WCHAR_T conv error %d/n",errno) ;  
  return -1;  
 }  
 iconv_close(env);  
 return (int)result;  
#endif  

 

相关文章推荐

MinGW字符编码转换的坑

#include #include #include #include #include #include // "你好啊"的UTF8编码 std::string s{"\xE4\xBD...
  • aqtata
  • aqtata
  • 2016年08月18日 15:39
  • 1052

解决msys和MinGW中文乱码以及输入中文问题

一直很喜欢gcc+vim这个貌似已经不用在强调了,好了,我只是想说明下我的问题是首先从gcc编译出错提示开始的 正如上面所说,安装完MinGW后使用gcc一编译,这程序没有错误还好,这一有错误发现输...

字符编码转换工具

  • 2017年07月12日 09:17
  • 349KB
  • 下载

字符编码转换工具

  • 2008年06月14日 14:27
  • 347KB
  • 下载

Linux/Windows 下字符编码转换

1、简介 最近的一个小项目,涉及到字符编码的转换问题,比如Windows下的多字节编码数据到Linux下后会是乱码,因为Windows下多字节编码使用的是GB2312,而Linux下默认则使用的UT...
  • CMbug
  • CMbug
  • 2015年05月14日 12:36
  • 1285

字符编码转换iconv

  • 2016年08月12日 15:05
  • 637KB
  • 下载

java字符编码转换研究(转)

java字符编码转换研究(转)   1. 概述 本文主要包括以下几个方面:编码基本知识,java,系统软件,url,工具软件等。 在下面的描述中,将以"中文"两个字为例,经查表...

URLEncode 字符编码转换

  • 2016年04月29日 08:54
  • 41KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:字符编码转换
举报原因:
原因补充:

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