ANIS与UNICODE字符格式转换:MultiByteToWideChar() 和WideCharToMultiByte() 函数
资料来自:
http://blog.csdn.net/holamirai/article/details/47948745
http://www.cnblogs.com/wanghao111/archive/2009/05/25/1489021.html
----------------------------------------------------------------------------------------------------------------
使用MultiByteToWideChar() 和 WideCharToMultiByte() 函数进行ANSI和UNICODE转换时,微软推荐通过执行同一函数两次,以确保转换成功,第一次执行获取保存转换结果所需内存大小,根据其返回值申请一片内存,第二次才真正执行转换。
MultiByteToWideChar() 返回值是确保转换成功的宽字符数,因此申请空间时需要乘以sizeof(wchar_t)。
WideCharToMultiByte() 返回值直接是确保转换成功所需的字节数,无需执行乘以sizeof操作;
具体实现可见示例代码。
宽字符到多字节字符转换函数
int WideCharToMultiByte(
UINT CodePage,
DWORD dwFlags,
LPCWSTR lpWideCharStr,
int cchWideChar,
LPSTR lpMultiByteStr,
int cbMultiByte,
LPCSTR lpDefaultChar,
LPBOOL lpUsedDefaultChar
);
CodePage: 指定要转换成的字符集代码页,它可以是任何已经安装的或系统自带的字符集,你也可以使用如下所示代码页之一。
CP_ACP 当前系统ANSI代码页
CP_MACCP 当前系统Macintosh代码页
CP_OEMCP 当前系统OEM代码页,一种原始设备制造商硬件扫描码
CP_SYMBOL Symbol代码页,用于Windows 2000及以后版本,我不明白是什么
CP_THREAD_ACP 当前线程ANSI代码页,用于Windows 2000及以后版本,我不明白是什么
CP_UTF7 UTF-,设置此值时lpDefaultChar和lpUsedDefaultChar都必须为NULL
CP_UTF8 UTF-,设置此值时lpDefaultChar和lpUsedDefaultChar都必须为NULL
注意:函数WideCharToMultiByte使用不当,会给影响程序的安全。调用此函数会很容易导致内存泄漏,因为lpWideCharStr指向的输入缓冲区大小是宽字符数,而lpMultiByteStr指向的输出缓冲区大小是字节数。为了避免内存泄漏,应确保为输出缓冲区指定合适的大小。我的方法是先使cbMultiByte为0调用WideCharToMultiByte一次以获得所需缓冲区大小,为缓冲区分配空间,然后再次调用WideCharToMultiByte填充缓冲区,详见下面的代码。另外,从Unicode UTF16向非Unicode字符集转换可能会导致数据丢失,因为该字符集可能无法找到表示特定Unicode数据的字符。
多字节字符到宽字符转换函数
int MultiByteToWideChar(
UINT CodePage,
DWORD dwFlags,
LPCSTR lpMultiByteStr,
int cbMultiByte,
LPWSTR lpWideCharStr,
int cchWideChar
);
dwFlags: 指定是否转换成预制字符或合成的宽字符,对控制字符是否使用像形文字,以及怎样处理无效字符。
MB_PRECOMPOSED 总是使用预制字符,即有单个预制字符时,就不会使用分解的基字符和不占空间字符。此为函数的默认选项,不能和MB_COMPOSITE合用
MB_COMPOSITE 总是使用分解字符,即总是使用基字符+不占空间字符的方式
MB_ERR_INVALID_CHARS 设置此选项,函数遇到非法字符就失败并返回错误码ERROR_NO_UNICODE_TRANSLATION,否则丢弃非法字符
MB_USEGLYPHCHARS 使用像形字符代替控制字符
示例代码
#include "iostream"
#include "windows.h"
using namespace std; void main()
{
// UINCONDE to ANSI
wchar_t* pwszUnicode = L"Holle, word! 你好,中国! ";
int iSize;
char* pszMultiByte;
iSize = WideCharToMultiByte(CP_ACP, , pwszUnicode, -, NULL, , NULL, NULL);
pszMultiByte = (char*)malloc((iSize)/**sizeof(char)*/);
WideCharToMultiByte(CP_ACP, , pwszUnicode, -, pszMultiByte, iSize, NULL, NULL);
cout<<"UINCONDE to ANSI:"<<pszMultiByte<<endl; // ANSI to UNICODE
locale loc( "chs" ); // 定义“区域设置”为中文方式
wcout.imbue( loc ); // 载入中文字符输入方式
char *pByteStr = "hello world! 你好,中国! ";
int iSize1;
wchar_t *pWideStr ;
iSize1 = MultiByteToWideChar(CP_ACP,,pByteStr,-,NULL,);
pWideStr = (wchar_t*)malloc(iSize1*sizeof(wchar_t));
MultiByteToWideChar(CP_ACP,,pByteStr,-,pWideStr,iSize1*sizeof(wchar_t));
wcout<<"ANSI to UNICODE:"<<pWideStr<<endl;
system("pause"); }
ANIS与UNICODE字符格式转换:MultiByteToWideChar() 和WideCharToMultiByte() 函数的更多相关文章
- HTML5 TypeArray和Unicode 字符之间转换
1.Uint32Array测试成功 // Uint32Array 测试成功 //字符串转为ArrayBuffer对象 function strToab() { var str = '张三丰'; var ...
- python 将字符串中的unicode字符码转换成字符
将字符串str =’\u98ce\u534e\u7684\u51b2\u950b'转换成汉字显示 可以直接print输出 print u'\u98ce\u534e\u7684\u51b2\u950b' ...
- C++ tinyXML的使用和字符编码转换
转载:http://jetyi.blog.51cto.com/1460128/761708/ 关于tinyxml使用的文档有很多(这篇文章就写的很好),这里仅提一下字符编码的转换问题,如果你不熟悉字符 ...
- Python—字符编码转换、函数基本操作
字符编码转换 函数 #声明文件编码,格式如下: #-*- coding:utf-8 -*- 注意此处只是声明了文件编码格式,python的默认编码还是unicode 字符编码转换: import sy ...
- UNICODE和ANSI字符串的转换(解释了MultiByteToWideChar,WideCharToMultiByte,GetTextCharsetInfo,GetTextCharset,IsDBCSLeadByte,IsDBCSLeadByteEx,IsTextUnicode一共7个函数)
继上集故事<多字符集(ANSI)和UNICODE及字符串处理方式准则 >,我们现在有一些特殊需求: 有时候我们的字符串是多字符型,我们却需要使用宽字符型:有的时候却恰恰相反. Window ...
- 关于MultiByteToWideChar与WideCharToMultiByte代码测试(宽字符与多字节字符的转换)以及字符串的转换代码测试
#pragma once #include <stdio.h> //getchar() #include <tchar.h> #include <stdlib.h> ...
- MultiByteToWideChar和WideCharToMultiByte用法详解, ANSI和UNICODE之间的转换
//========================================================================//TITLE:// MultiByteToW ...
- 扩展ASCII码,不同的国家有不同的字符集。Unicode转换为utf8的规则,utf8没有大小端的问题。超过0xFFFF的Unicode字符WINAPI也无能为力(附各种字符编码表及转换表)good
一.概念 1,ASCII ASCII(American Standard Code for Information Interchange),中文名称为美国信息交换标准代码.是 ...
- unicode编码、字符的转换和得到汉字的区位码
一:unicode编码.字符的转换截图 二:unicode编码.字符的转换代码 using System; using System.Collections.Generic; using System ...
随机推荐
- CodeForces 126B Password
题目链接:http://codeforces.com/problemset/problem/126/B 题目大意: 多组数据每组给定1个字符串S,问是否存在S的一个尽量长的子串,同时是S的前缀和后缀, ...
- 神经网络-SGD-2
接上节: 3.梯度(gradient): def numerical_gradient(f,x): h=1e-5 grad=np.zeros_like(x) for index_x in range( ...
- checkbox选中事件的正确写法
判断选中CHECKBOX事件 网上各种扯淡 搞死我了..加上总觉得smarty引擎和JSJQ有很多冲突.. $("#id").is(":checked");
- SQL Server 只安装客户端的方法
只安装管理工具
- Previous Workflow Versions in Nintex Workflow
Previous Workflow Versions in Nintex Workflow September 4, 2013 It occurred to me that even though I ...
- Let's Encrypt免费泛域名证书申请
一. 下载acme.sh,以下四条命令任选一条即可 curl https://get.acme.sh | shwget -O - https://get.acme.sh | sh curl https ...
- sed 收集
#删除倒数第二行的最后的逗号 一条命令 sed ':1;$b;N;/InnoDB/!b1;s/,\n)/\n)/'
- BZOJ2565最长双回文串——manacher
题目描述 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为“abc”,逆序为“cba”,不相同).输入长度为n的串S,求S的最长双回文子串T,即可将T分为两 ...
- Sublime Text ——3200破解补丁
声明 该资源来源于网络,只为学习交流使用,侵权联系删除.长期使用和觉得sublime text 不错的话,还望购买授权码,多多支持正版!!! 重要的事情说三遍 请支持正版!!! 请支持正版!!! 请支 ...
- 第二十二天 logging hashlib re 模块
今日内容 logging功能完善的日志模块 re正则表达式模块主要处理字符串匹配 查找 搜索给你一个字符串 要从中找到你需要的东西 爬虫大量使用 hashlib hash算法相关的库 算法怎么算不需要 ...