Win32 - 04 编码转换CRT版本
来源:互联网 发布:淘宝商品降权3天恢复 编辑:程序博客网 时间:2024/06/05 00:49
Win32 - 04 编码转换CRT版本
分类: Win32编程 (2) Win32基础 2010-01-27 00:38171人阅读 评论(0)收藏 举报
既然不同的平台有字符集的差别,那么在不同平台之间传递数据就需要进行“编码转换”。
本例介绍了如何利用C标准库函数对UNICODE编码和ASCII编码进行转换,转换目标是将ASCII编码(或本地编码,例如GBK编码)字符/字符串与UNICODE编码字符串进行相互转化。
1 #include <tchar.h>2 #include <locale.h>3 #include <stdio.h>4 #include <errno.h>5 #include <stdlib.h>6 7 #define BUF_LEN 5128 9 int _tmain(int argc, TCHAR* argv[])10 {11 // 定义UNICODE编码字符12 wchar_t wc = L'大';13 // 定义ASCII/GBK编码字符缓冲(其容量可以存放一个中文字符)14 char szChar[3] = "";15 int i, nError;16 17 // 定义UNICODE编码字符串18 const wchar_t* lpcszW = L"Hello, 大家好!";19 // 定义指向ASCII编码字符串的指针20 char* lpszBuffer = NULL;21 // 定义指向UNICODE编码字符串的指针22 wchar_t* lpwcsBuffer = NULL;23 // 定义字符串长度变量24 size_t nLength = 0; // size_t映射为unsigned int类型25 26 // 设置当前语言环境(中文)27 _tsetlocale(LC_ALL, _T("zhi"));28 29 // 将UNICODE字符转为对应的ASCII/GBK字符串30 // (一个UNICODE字符占据2个字节,加上/0共三个字节)31 nError = wctomb_s(&i, // 返回转换后占用的字节数32 szChar, // 保存转换结果的缓冲数组33 3, // 保存转换结果的缓冲数组长度34 wc // 要转换的UNICODE字符35 );36 // wctomb_s函数返回0表示运行正确,否则表示运行失败37 if (nError == 0) {38 printf("转换后的字符串为:%s", szChar);39 } else {40 _tprintf(_T("字符转化失败"));41 }42 43 // 给ASCII/GBK缓冲内存放新汉字44 strcpy_s(szChar, 3, "小");45 // 将一个ASCII/GBK字符串转化为UNICODE字符46 nError = mbtowc(&wc, // 指向UNICODE字符变量的指针47 szChar, // 指向要转换ASCII/GBK字符串的指针48 strlen(szChar) // 要转换ASCII/GBK字符串长度49 );50 51 // mbtowc函数如果运行正确,返回转化结果的字符串长度;返回0表示参数1为/0字符;返回-1表示失败52 if (nError > 0) {53 wprintf(L"/n转换后的字符为:%c", wc);54 } else {55 _tprintf(_T("/n字符转化失败"));56 }57 58 // UNICODE编码转为ASCII编码59 // 第一步,获取缓冲区长度(不包括/0字符)60 nLength = wcstombs(61 NULL, // 指向待转化的ASCII/GBK字符串缓冲的指针,此时填NULL62 lpcszW, // 要转化的UNICODE字符串指针63 0 // 参数1缓冲区长度,单位字节64 ) + 1; // 由于函数返回的ASCII/GBK缓冲区长度不包括/0字符,所以结果要加165 66 if (nLength == -1 && errno == EILSEQ) {67 _tprintf("/n转换失败");68 } else {69 // 第二步,分配缓冲区70 if (lpszBuffer = (char*)malloc(nLength)) {71 72 // 第三步,转化字符串,再次调用wcstombs函数,73 // 此时第1个参数填写上一步分配的缓冲区指针,74 // 第3个参数填写缓冲区长度75 wcstombs(lpszBuffer, lpcszW, nLength);76 printf("/n转化后的字符串为:%s", lpszBuffer);77 78 // ASCII编码转为UNICODE编码,步骤和解释类似79 // 于与UNICODE编码转为ASCII编码80 81 // 第一步,获取缓冲区长度82 nLength = mbstowcs(NULL, lpszBuffer, 0) + 1;83 if (nLength == -1 && errno == EILSEQ) {84 _tprintf("/n转换失败");85 } else {86 87 // 第二步,分配缓冲区88 if (lpwcsBuffer = (wchar_t*)malloc(nLength * sizeof(wchar_t))) {89 90 // 第三步,转化字符串91 mbstowcs(lpwcsBuffer, lpszBuffer, nLength);92 wprintf(L"/n转化后的字符串为:%s", lpwcsBuffer);93 94 free(lpwcsBuffer);95 } else {96 _tprintf(_T("/n内存分配失败"));97 }98 }99 free(lpszBuffer);100 } else {101 _tprintf(_T("/n内存分配失败"));102 }103 }104 105 _tprintf(_T("/n"));106 _tsystem(_T("pause"));107 return 0;108 }
- Win32 - 04 编码转换CRT版本
- Win32编码转换
- [Win32][C++]编码转换
- Win32 Debug CRT Heap Internals
- Win32 Debug CRT Heap Internals
- Text文件编码转换vbs版本
- 《Win32多线程程序设计》CRT中的多线程
- linux中文乱码CRT字符编码设置
- Win32 字符编码
- WIN32字符编码
- win32 编码转化函数
- Win32 字符编码
- Win32 - 关于UNICODE编码
- win32编程 编码问题
- win32字节+编码处理
- Win32 CRT and MFC 清单文件.manifest配制
- CRT
- CRT
- 童年的那些事
- AutoCAD 二次开发学习系列【1】- 初步了解开发环境
- 零阶一类贝塞尔函数曲线及其包络线 matlab源程序
- Windows8自带拼音输入法的彻底删除
- 亚马逊中国购物攻略
- Win32 - 04 编码转换CRT版本
- .net 让textbox readonly的办法
- Mybatis源码
- mapreduce流程1
- Android系统学习1
- eclipse 快捷键
- hibernate修改数据变插入
- Mybatis哲学
- C#委托基础6——泛型委托Predicate