字符串处理 - ANSI - Unicode - UTF8 转换

#include <stdio.h>
#include <windows.h>
#include <locale.h>
#define BUFF_SIZE 1024 

wchar_t * ANSIToUnicode( const char* str )
{
     int textlen ;
     wchar_t * result;
     textlen = MultiByteToWideChar( CP_ACP, 0, str,-1, NULL,0 );
     result = (wchar_t *)malloc((textlen+1)*sizeof(wchar_t));
     memset(result,0,(textlen+1)*sizeof(wchar_t));
     MultiByteToWideChar(CP_ACP, 0,str,-1,(LPWSTR)result,textlen );
     return result;
} 

char * UnicodeToANSI( const wchar_t* str )
{
     char* result;
     int textlen;
     textlen = WideCharToMultiByte( CP_ACP, 0, str, -1, NULL, 0, NULL, NULL );
     result =(char *)malloc((textlen+1)*sizeof(char));
     memset( result, 0, sizeof(char) * ( textlen + 1 ) );
     WideCharToMultiByte( CP_ACP, 0, str, -1, result, textlen, NULL, NULL );
     return result;
} 

wchar_t * UTF8ToUnicode( const char* str )
{
     int textlen ;
     wchar_t * result;
     textlen = MultiByteToWideChar( CP_UTF8, 0, str,-1, NULL,0 );
     result = (wchar_t *)malloc((textlen+1)*sizeof(wchar_t));
     memset(result,0,(textlen+1)*sizeof(wchar_t));
     MultiByteToWideChar(CP_UTF8, 0,str,-1,(LPWSTR)result,textlen );
     return result;
} 

char * UnicodeToUTF8( const wchar_t* str )
{
     char* result;
     int textlen;
     textlen = WideCharToMultiByte( CP_UTF8, 0, str, -1, NULL, 0, NULL, NULL );
     result =(char *)malloc((textlen+1)*sizeof(char));
     memset(result, 0, sizeof(char) * ( textlen + 1 ) );
     WideCharToMultiByte( CP_UTF8, 0, str, -1, result, textlen, NULL, NULL );
     return result;
}
/*宽字符转换为多字符Unicode - ANSI*/
char* w2m(const wchar_t* wcs)
{
      int len;
      char* buf;
      len =wcstombs(NULL,wcs,0);
      if (len == 0)
          return NULL;
      buf = (char *)malloc(sizeof(char)*(len+1));
      memset(buf, 0, sizeof(char) *(len+1));
      len =wcstombs(buf,wcs,len+1);
      return buf;
}
/*多字符转换为宽字符ANSI - Unicode*/
wchar_t* m2w(const char* mbs)
{
      int len;
      wchar_t* buf;
      len =mbstowcs(NULL,mbs,0);
      if (len == 0)
          return NULL;
      buf = (wchar_t *)malloc(sizeof(wchar_t)*(len+1));
      memset(buf, 0, sizeof(wchar_t) *(len+1));
      len =mbstowcs(buf,mbs,len+1);
      return buf;
} 

char* ANSIToUTF8(const char* str)
{
     return UnicodeToUTF8(ANSIToUnicode(str));
} 

char* UTF8ToANSI(const char* str)
{
     return UnicodeToANSI(UTF8ToUnicode(str));
} 

int main()
{
     /*使用wcstombs和mbstowcs之前必须调用setlocale,以便决定内码*/
     setlocale(LC_ALL,".936");
     /*假定有一个Unicode(UTF-16LE)编码的文件,将其打开,重新编码为ANSI
,写入aa.txt中,再继续编码回Unicode,写入aw.txt中*/
     /*如果不存在a.txt文件,则程序出错,没有做错误处理*/
     char* filename = "a.txt";
     char* filenamea = "aa.txt";
     char* filenamew = "aw.txt";
     FILE*     input=fopen( filename, "rb");
     FILE*     inputa=fopen( filenamea, "wb");
     FILE*     inputw=fopen( filenamew, "wb");
     wchar_t * buf ;
     /*BOE设置,UTF-16LE的BOE为FEFF,如果不先将其读取出来,wcstombs会调用失败*/
     fgetwc(input);
     fputwc(0xFEFF,inputw);
     /*开始读取文件*/
     while(!feof(input))
     {
        buf = (wchar_t *)malloc(sizeof(wchar_t)*BUFF_SIZE)         ;
        memset(buf,    0, sizeof(wchar_t) * BUFF_SIZE );
        fgetws(buf,    BUFF_SIZE,    input);
        fputs(w2m(buf),    inputa);
        fputws(m2w(w2m(buf)),    inputw);
     }
     /*后续处理*/
     fclose(input);
     fclose(inputa);
     fclose(inputw);
     free(buf); 

     return 0;
}
时间: 2024-11-10 11:04:59

字符串处理 - ANSI - Unicode - UTF8 转换的相关文章

python 保存文本txt格式之总结篇,ANSI,unicode,UTF-8

是否还曾记得如何保存成想要格式,那是多么的折腾,是不是莫名起码就变成ANSI或者UTF-8了 今天我来让大家随心所欲的保存想要的格式 首先说下今天的主角 import codecs 使用他才能保存成想要的格式 工作原理,首先把保存的数据解码程unicode格式,然后对应相应的编码,写入文件即可 文本格式对应表 ANSI---->GBK UTF-8---->UTF-8 Unicode---->UTF-16 只有中间才是对应的,其他都是不对应的,多坑爹 基本操作就是 #!/usr/bin/e

Unicode UTF-8 转换

Unicode是类似“U+4E25”或“\u4E25”的编码方式,很多情况下是4个十六进制的数,有时候不止. Unicode编码系统可分为编码方式和实现方式两个层次: 编码方式:“严”的Unicode是4E25: 实现方式:“严”的UTF-8是E4B8A5. Unicode的实现方式称为Unicode转换格式(Unicode Transformation Format,简称为UTF),UTF-8(8-bit Unicode Transformation Format)是Unicode一种实现方式

[Python爬虫] 中文编码问题:raw_input输入、文件读取、变量比较等str、unicode、utf-8转换问题

最近研究搜索引擎.知识图谱和Python爬虫比较多,中文乱码问题再次浮现于眼前.虽然市面上讲述中文编码问题的文章数不胜数,同时以前我也讲述过PHP处理数据库服务器中文乱码问题,但是此处还是准备简单做下笔记.方便以后查阅和大家学习. 中文编码问题的处理核心都是--保证所有的编码方式一致即可,包括编译器.数据库.浏览器编码方式等,而Python通常的处理流程是将unicode作为中间转换码进行过渡.先将待处理字符串用unicode函数以正确的编码转换为Unicode码,在程序中统一用Unicode字

Ansi UNICODE,GBK,UTF-8区别

http://my.oschina.net/saintzbs/blog/165034 http://my.oschina.net/saintzbs/blog/165034 http://www.cnblogs.com/cy163/archive/2007/05/31/766886.html 1:可以借助于文本编辑页面和Compare进行理解.      Unicode.utf-8.GB2312等,但是在windows命令行里敲notepad进入文本编辑页面.保存时需要选择编码方式,但是不存在GB

[Python] 中文编码问题:raw_input输入、文件读取、变量比较等str、unicode、utf-8转换问题

最近研究搜索引擎.知识图谱和Python爬虫比较多,中文乱码问题再次浮现于眼前.虽然市面上讲述中文编码问题的文章数不胜数,同时以前我也讲述过PHP处理数据库服务器中文乱码问题,但是此处还是准备简单做下笔记.方便以后查阅和大家学习.        中文编码问题的处理核心都是——保证所有的编码方式一致即可,包括编译器.数据库.浏览器编码方式等,而Python通常的处理流程是将unicode作为中间转换码进行过渡.先将待处理字符串用unicode函数以正确的编码转换为Unicode码,在程序中统一用U

字符串和数字之间的转换(Unicode)

1 Unicode编码的字符串转换为数字类型 CString str; str = _T("1234"); int i = _ttoi(str); float f = _tstof(str); 2 数字转换为wchar_t wchar_t c[10]; int num = 100; _itow_s(num,c,10,10进制); wstring str(c); 3 wstring 转换为int wstring str; _wtoi(str.c_str); 那么究竟什么是Unicode?

【转】【编码】ANSI,ASCII,Unicode,UTF8

不同的国家和地区制定了不同的标准,由此产生了 GB2312.GBK.GB18030.Big5.Shift_JIS 等各自的编码标准.这些使用多个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码.在简体中文Windows操作系统中,ANSI 编码代表 GBK 编码:在繁体中文Windows操作系统中,ANSI编码代表Big5:在日文Windows操作系统中,ANSI 编码代表 Shift_JIS 编码.不同 ANSI 编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,

C++转换unicode utf-8 gb2312编码

windows开发环境下用VC++6.0 对unicode .utf-8. gb2312 三种编码格式之间的转换方法: [cpp] view plaincopy #include <iostream> #include <string> #include <Windows.h> using namespace std; void unicodeToUTF8(const wstring &src, string& result) { int n = Wid

c++字符串编码GBK到UTF8的转换

使用c++跨windows和linux平台实现字符串GBK到UTF8的转换. 原理是GBK字符串先转为unicode编码,然后再转换为UTF8编码. 代码如下: #ifndef __CODE_CONVERT_H__ #define __CODE_CONVERT_H__ #include <cstdio> #include <stdlib.h> #include <locale.h> #include <string> #if defined(_WIN32)