Ansi 与 Unicode 字符串类型的互相转换

WideCharToMultiByte 实现宽字节转换到窄字节
MultiByteToWideChar 实现窄字节转换到宽字节

WideCharToMultiByte 的代码页用来标记与新转换的字符串相关的代码页;
MultiByteToWideChar 的代码页用来标记与一个多字节字符串相关的代码页,

[1]、常用的代码页有 CP_ACP 和 CP_UTF8 两个:

使用 CP_ACP 代码页就实现了 ANSI 与 Unicode 之间的转换;--- 我们所用的!
使用 CP_UTF8 代码页就实现了 UTF-8 与 Unicode 之间的转换。

[2]、dwFlags 参数允许我们进行额外的控制,但是,一般情况下都不使用这个标志,直接传递 0 就行了。

[3]、lpDefaultChar和pfUsedDefaultChar:只有当WideCharToMultiByte函数遇到一个宽字节字符,而该字符在uCodePage参数标识的代码页中并没有它的表示法时,WideCharToMultiByte函数才使用这两个参数。如果宽字节字符不能被转换,该函数便使用lpDefaultChar参数指向的字符。如果该参数是NULL(这是大多数情况下的参数值),那么该函数使用系统的默认字符。该默认字符通常是个问号。这对于文件名来说是危险的,因为问号是个通配符。pfUsedDefaultChar参数指向一个布尔变量,如果Unicode字符串中至少有一个字符不能转换成等价多字节字符,那么函数就将该变量置为TRUE。如果所有字符均被成功地转换,那么该函数就将该变量置为FALSE。当函数返回以便检查宽字节字符串是否被成功地转换后,可以测试该变量。

● 两个转换函数的使用举例:

char *cctryWideCharToAnsi(wchar_t *pWideChar)
{
if (!pWideChar) return NULL;
char *pszBuf = NULL;
int needBytes = WideCharToMultiByte(CP_ACP, 0, pWideChar, -1, NULL, 0, NULL, NULL);
if (needBytes > 0){
pszBuf = new char[needBytes+1];
ZeroMemory(pszBuf, (needBytes+1)*sizeof(char));
WideCharToMultiByte(CP_ACP, 0, pWideChar, -1, pszBuf, needBytes, NULL, NULL);
}

return pszBuf;
}

wchar_t* p = L"这个是宽字节转窄字节";

char* buf = cctryWideCharToAnsi(p);

wchar_t *cctryAnsiCharToWide(char *pChar)
{
if (!pChar) return NULL;
wchar_t *pszBuf = NULL;
int needWChar = MultiByteToWideChar(CP_ACP, 0, pChar, -1, NULL, 0);
if (needWChar > 0){
pszBuf = new wchar_t[needWChar+1];
ZeroMemory(pszBuf, (needWChar+1)*sizeof(wchar_t));
MultiByteToWideChar(CP_ACP, 0, pChar, -1, pszBuf, needWChar);
}

return pszBuf;
}

char* p = "窄字节转宽字节";

wchar_t* result;

result = cctryAnsiCharToWide(p);

最后记得delete[] ..

〓※※※〓 使用过后千万别忘记释放空间…… delete[]...

也可以使用

● A2W、W2A、T2A、T2W 宏的使用以及注意事项

A2W,就是ANSI转unicode

W2A,就是UNICODE转ANSI

USES_CONVERSION; //记得加上这句
wchar_t* pw = L"你好,这个是宽字节转窄字节\r\n";
char* p = W2A(pw);

时间: 2024-10-14 14:41:42

Ansi 与 Unicode 字符串类型的互相转换的相关文章

python中文和unicode字符串之间的互相转换

首先:中文->unicode字符串 import chardet import codecs >>> a = "我是一个中国人">>> a'\xce\xd2\xca\xc7\xd2\xbb\xb8\xf6\xd6\xd0\xb9\xfa\xc8\xcb' >>> chardet.detect(a){'confidence': 0.99, 'encoding': 'GB2312'}>>> b = a.decod

Windows 下处理 ANSI 与 Unicode 字符串的一些小技巧

1. 开始将文本字符串想象为字符的数组,而不是char或字节的数组. 2. 为文本字符和字符串使用泛型(比如TCHAR/PTSTR). 3. 为字节.字节指针和数据缓冲区使用显式数据类型(BYTE和PBYTE) . 4. 为literal字符和字符串使用TEXT或_T宏,但为了保持一致性和更好的可读性,请 避免两者混用. 5. 执行全局替换.(例如,用PTSTR替换PSTR).6. 修改字符串算术问题.例如,函数经常希望你传给它缓冲区的字符数,而不是字节数. 这意味着你应该传入_countof(

多字符集(ANSI)和UNICODE及字符串处理方式准则

在我们编写程序的时候,使用最多的是字符串的处理,而ANSI和UNICODE的相互转换经常搞的我们头晕眼乱. 应该说UNICODE是一种比较好的编码方式,在我们的程序中应该尽量使用UNICODE编码方式,我们在编写程序的时候,最好能依据下面的准则来进行: 基本准则: 1.将文本字符串想象为字符数组,而非char或字节数组 2.开始使用通用数据类型来表示文本字符和字符串(如TCHAR,PTSTR) 原因是我们可以在WinNT.h的头文件中找到如下定义(代码有删改): [cpp] view plain

ANSI与Unicode的转换

最近遇到中文路径访问的问题,又重新学习了一遍ansi与Unicode的知识,博文记录下来以供后续参考. ANSI 编码 ANSI是一种字符代码,为使计算机支持更多语 言,通常使用0x80~0xFF 范围的2 个字节来表示1 个字符.不同的国家和地区制定了不同的标准,由此产生了GB2312.GBK.GB18030.Big5.Shift_JIS 等各自的编码标准. 这些使用多个字节来代表一个字符的各种汉字延伸编码方式,称为ANSI 编码. 关于MBCS字符集(Multi Byte Character

C++字符串类型和数字之间的转换

转载:http://www.cnblogs.com/luxiaoxun/archive/2012/08/03/2621803.html 1.字符串数字之间的转换 字符串---字符数组(1)string --> char *   string str("OK");   char * p = str.c_str(); 字符数组---字符串(2)char * -->string   char *p = "OK";   string str(p); 字符数组--

Go语言中其他数据与字符串类型的转换

1 概述 Go语言是强类型语言,因此总会需要将字符串转成需要的类型.比如整型和字符串转换,字符串和布尔型的转换等.本文就介绍如何完成这些转换,以下是Go语言关于字符串转换的整理说明,主要是与切片类型的转换,和 strconv 包的使用. 2 与切片的转换 切片类型可以和字符串类型相互转换. fmt.Println([]rune("Hello小韩说课")) // [72 101 108 108 111 23567 38889 35828 35838] fmt.Println(string

js字符串或则布尔值转换成数字类型的四种方法

1.parseInt() 2.parseFloat() 3.Number() 4.通过减法或者乘法把其他类型的值转换为数字类型 例子: // 转换成数字类型的4种方法 // 1.parseInt var a = '1.03'; var b = '1.01a'; var c = 'a1'; var d = true; var e = false; console.log(parseInt(a)); // 1 小数字符串,使用parseInt会把小数取整 console.log(parseInt(b

Python 字符串类型列表转换成真正列表类型

我们在写代码的过程中,会经常使用到for循环,去循环列表,那么如果我们拿到一个类型为str的列表,对它进行for循环,结果看下面的代码和图: str_list = str(['a','b','c']) for row in str_list: print(row) 结果: 那么for循环就把str类型的列表的每一个字符都一个一个的循环的打印出来,而这个结果并不是我们想要的,那么如何解决这个问题?,使用到第三方模块,看下面的代码 from ast import literal_eval # 假设拿

ANSI和UNICODE编程的注意事项

建立UNICODE编码工程 在VC60下,默认方式下建立的是ANSI编码的工程(注:编译的exe内部,其资源字符是以UNICODE保存),建立UNICODE编码工程的方法: 1.为工程添加UNICODE和_UNICODE预处理选项.   具体步骤:打开[工程]->[设置-]对话框,在C/C++标签对话框的"预处理程序定义"中去除_MBCS,加上_UNICODE,UNICODE.(注意中间用逗号隔开). 在没有定义UNICODE和_UNICODE前,所有函数和类型都默认使用ANSI