字符编码转换

原创 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  

 

第一个项目:字符画神器——全程制作历程

第一个项目:字符画神器——全程制作历程本文适用于:java入门程序员 **读本文你可以学到: 1、一个初级程序员是如何设计初级程序的。 2、字符画的设计原理。 ...
  • qq_36325305
  • qq_36325305
  • 2017年02月09日 21:07
  • 441

java基础之字符、字节的概念及其区别

转载自:http://blog.sina.com.cn/s/blog_6ede15b10100nrxp.html 转载▼        首先我们先看一下这个问题:“Java语言中字符串“学...
  • u012960536
  • u012960536
  • 2015年07月19日 23:28
  • 3289

字符数组与字符指针的区别与联系

1.字符指针可以指向一个字符串。 我们可以用字符串常量对字符指针进行初始化。例如,有说明语句: char *str = "This is a string."; 是对字符指针进行初始化。此时,字...
  • zhaoshuzhaoshu
  • zhaoshuzhaoshu
  • 2014年07月10日 11:15
  • 2382

字符分割(二)

ANN在训练和识别时都只能将一个单独的数字作为样本,因此对于扫描图像中的多个连续数字需要进行分割。具体算法如下:       1,确定图像中字符的大致高度范围:先自下而上对图像进行逐行扫描,直到遇到...
  • s12244315
  • s12244315
  • 2015年11月07日 15:56
  • 1227

转义字符与特殊字符

1.转义字符: C中定义了一些字母前加"\"来表示常见的那些不能显示的ASCII字符,如\0,\t,\n等,就称为转义字符,因为后面的字符,都表示的不是它本来的ASCII字符意思。 常见的转义字符: ...
  • u011919606
  • u011919606
  • 2016年03月28日 16:10
  • 4851

剑指offer----字符流中第一个不重复的字符----java实现

题目描述 请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一...
  • snow_7
  • snow_7
  • 2016年07月17日 21:17
  • 1139

[C/C++]_[初级]_[替换过滤utf8字符串里无效字符]

场景: 1. 分析数据时,获取到的数据是字符串,但是有可能不是正确的完整的utf8字符串,打印出来或输出到文件时表现出来的就是显示乱码. 这时候就需要过滤掉非法字符使utf8字符串能正确显示, 比如把...
  • infoworld
  • infoworld
  • 2015年09月10日 15:42
  • 4083

JAVA中清除特殊字符

String regEx="[`~!@#$%^&*()+=|{}':;',\\[\\].         String   str   =   "*adCVs*34_a _09_b5*[/435^*&...
  • aicpzl
  • aicpzl
  • 2015年12月04日 11:02
  • 5516

scanf读取单个字符问题

在编写简单程序寻找元音字母小程序是遇到的问题: 原本计划在程序中用到scanf("%c",ch)读取单个字符,但是在一次执行过程中出现运行两次的情况:#include #include int ...
  • qiye005
  • qiye005
  • 2015年06月26日 15:48
  • 2155

字符指针与字符数组真正的区别

本文从字符串指针与字符串数组的例子开始,讲述了C语言中使用内存的不同方式,以及他们与Linux内存布局的关系。并使用Linux下的工具对想法进行了验证。...
  • on_1y
  • on_1y
  • 2013年10月25日 20:46
  • 13220
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:字符编码转换
举报原因:
原因补充:

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