宽字符已经困扰我很久了,以前我都是设置项目的属性把它改为多字节,不用UNICODE。不过现在又遇到宽字节的问题,没有办法,只有硬着头皮学学:
我找到的资料:
http://hi.baidu.com/shongbee2/blog/item/207925546b6cdd5fd10906e0.html
http://hi.baidu.com/shongbee2/blog/item/d4a057511e9539878c5430cb.html
看了之后我才发现原来有wcsXXX的函数专门处理宽字节的,就是strXXX一样好使。呵呵,我不再惧怕了,就试着自己写了一下,还是学了蛮多东西的:
1.有wcsXXX的函数和strXXX的函数对应处理宽字节,wcslen就是求长度的,wcscmp就是比较两个字符串的。
2.输出也有相关的操作,wprintf(L”%s%s”);这样的操作,对文件也可以用fwprintf函数来输出。不过我发现貌似cout << wchar;不成功。也发现了一个问题,就是我输出”相等”这样一个字符串的时候,发现居然输出不正确,无论是控制台和文件都有错误。可见,这个还是有点小问题的。输出其他的例如”12345”等都是正常的。哎,这个函数并不可靠啊。
3.宽字节和普通串的转换问题,学了两个函数,一个是:
wcstombs(char* strDes, const wchar*, size_t nMax);这个函数的作用是把wchar转换为char。
char* strDes 为保存转换后的普通字符串,wchar* 要被转换的宽字符串。转换的最大长度。这里的长度是转换的个数,而不是字节长度。
mbstowcs() 就是一个相反的过程了,参数就不说了。
另一套转换的函数是:
int WideCharToMultiByte(
UINT CodePage,
DWORD dwFlags,
LPCWSTR lpWideCharStr,
int cchWideChar,
LPSTR lpMultiByteStr,
int cbMultiByte,
LPCSTR lpDefaultChar,
LPBOOL lpUsedDefaultChar
);
他的参数很多,上面的连接有介绍,这里就不怎么细说了。
第一个是编码的方式,我一般用CP_ACP。第二个是转换标志,MSDN上说什么都不设置更快,然后我就什么都不管了就用NULL了。具体作用不知道,等遇到了再学。第三个参数就是被转换的字符串,第四个参数是该字符串的长度,-1表示自动算长度,如果是手动给出,一定要把最后的终结符长度也算上。我觉得还是-1来的实际。第五个参数就是保存转换串的指针,第六个参数就是保存串的长度,这里是单位字符的个数。如果转换的时候没有终结符,那么结果也没有终结符,要注意下。最后两个参数就是默认的填充字符和是否使用了默认填充字符,我一般就用NULL代替。
普通串转宽字节也是类似。
这里有几个注意的,一定要保证空间足够。还有就是那个长度是单位字符个数,而不是字节数,在转换时,推荐被转换的字符串长度设置为-1,因为这样他会自动算出终结符结束。返回值也是转换的单位字符个数。例如”相等”有普通串转换为宽字节串,返回结果是3,(有终结符),而反过来就是5。如果返回时0 说明转换失败。
心得:虽然WideCharToMultiByte的参数要多,感觉用的没有wcstombs爽,可是他的准确好高一些,要转换的话,还用用WideCharToMultiByte比较合适,还有就是虽然有一套wcsXXX的库函数,可惜输出还是出现问题的。如果全都用宽字节,那没有关系wcsxxx的函数还是蛮好用的。还有一个疑惑我明明查字典multi是多的意思也就是说multibyte是多字节,我的中文版VS2005配置里面也是说的多字节。搞不懂为什么要用宽字节呢?可能是多字节编码不好用吧。呵呵。 废话也说完了,奉上源代码:
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->#include <iostream>
#include <fstream>
#include <windows.h>
using namespace std;
int main()
{
FILE* fp ;
WCHAR wchar[5] = L"相等相等"; //定义一个宽字节的变量,初始为"相等"
fp = fopen("1.txt", "w+"); //打开文件称奥做
fwprintf(fp, L"%s\n", wchar); //输出到文件
fclose(fp); //关闭文件
WCHAR wc2[5]; //定义第二个宽字节变量
//wc开始的有很多宽字节的操作。都和str相对应。
wcscpy(wc2, wchar); //复制。
int n = wcscmp(wc2, wchar); //比较
if (n == 0)
{
wprintf(L"相等\n"); //这里是否注意到没有wprintf有问题的。
}
char str[10]; //定义char字符。
n = wcstombs(str, wc2, 9); //宽字节转换为muiltychar
printf("%s\n", str); //输出结果
for (int i = 0; i < 5; ++i)
{
wc2[i] = L'1' + i;
}
wc2[4] = 0;
n = wcstombs(str, wc2, 9); //宽字节转换为muiltychar
printf("%s\n", str); //输出结果
//另外的方式转换
n = WideCharToMultiByte(CP_ACP, NULL, wchar, wcslen(wchar) + 1, str, 10, 0, 0);
printf("%s\n", str);
char str2[10] = "加一";
WCHAR wc3[10];
n = MultiByteToWideChar(CP_ACP, NULL, str2, strlen(str2) + 1, wc3, 10); //char到宽字节。
system("pause");
return 0;
}
不要脸的再次放入精华区,因为我觉得他困扰我太久了。呵呵
分享到:
相关推荐
#### 总结 本文详细介绍了如何在C++中实现`char`与`wchar_t`之间的相互转换,并提供了具体的代码示例。通过理解和掌握这些知识,可以更好地处理不同编码格式的文本数据,提高程序的兼容性和健壮性。
VC++中的char,wchar_t,TCHAR详解 在VC++中,char、wchar_t和TCHAR是三个非常重要的字符类型,它们之间的区别和使用方法是初学者需要了解的基础知识。下面我们将详细介绍这三个字符类型的概念、用法和区别。 一、...
C++程序开发 wchar.h 头文件源码 存放到bits文件夹
char 转wchar_t 及wchar_t转char的实现函数及原理说明
在C++编程中,`wchar_t`是一种宽字符类型,用于处理多字节或Unicode字符。它在标准库中被定义为一个不小于`int`的整型类型,通常用来存储单个宽字符,比如UTF-16编码的Unicode字符。`wchar_t`的数据类型在处理非...
### char、TCHAR、WCHAR 的区别与应用 在C/C++编程中,尤其是在Windows平台上的开发中,正确理解和使用`char`、`TCHAR`、`WCHAR`这三种字符类型对于处理文本数据至关重要。下面我们将深入探讨这三种类型的特点、...
在编程领域,尤其是在Windows系统和C++编程中,`WCHAR` 和 `CHAR` 是两种常用的字符类型。它们分别代表宽字符和窄字符,用于处理不同的字符编码,尤其是在处理多语言和Unicode支持时。本文将深入讲解这两个类型,并...
C语言头文件 WCHARC语言头文件 WCHARC语言头文件 WCHARC语言头文件 WCHARC语言头文件 WCHARC语言头文件 WCHARC语言头文件 WCHARC语言头文件 WCHARC语言头文件 WCHARC语言头文件 WCHARC语言头文件 WCHARC语言头文件 ...
本文将深入解析几种常见的字符串类型,包括`CString`、`LPCTSTR`、`LPTSTR`、`TCHAR`、`WCHAR`、`string`、`wchar_t`和`char`。 1. `CString`:`CString`是Microsoft MFC(Microsoft Foundation Classes)库中定义...
在C++编程中,`wchar_t` 和 `char` 是两种不同的字符类型,它们分别用于处理宽字符和窄字符。`wchar_t` 通常用于表示多字节字符,如Unicode编码,而 `char` 通常用于ASCII编码。当需要在两者之间进行转换时,必须...
实现char wchar_t 之间的转换程序
`CString`、`wchar_t`、`int`、`string`和`char*`都是编程中常用的字符串和数值类型,它们之间互相转换有助于在不同场景下灵活地处理数据。本篇文章将详细介绍这些类型之间的转换方法。 首先,`CString`是Microsoft...
1、区别wchar_t,char,WCHAR ANSI:即 char,可用字符串处理函数:strcat( ),strcpy( ), strlen( )等以str打头的函数。 UNICODE:wchar_t是Unicode字符的数据类型,它实际定义在里: typedef unsigned short wchar_t;...
当在 windows 下开发程序库时,使用 TCHAR 类型,比直接使用 char 和 wchar_t 具有更好的移植性。但是在编写动态链接库时,不能直接导出 TCHAR 类型的函数,给 TCHAR 类型函数的使用带来了一些限制。使用 texport 在...
cgo.wchar 帮助在cgo中使用wchars。 例子 go.hid库中的示例: func ( dev * Device ) ManufacturerString () ( string , error ) { // create WcharString ws := wchar . NewWcharString ( 100 ) // retrieve ...
在编程领域,尤其是在Windows开发中,经常需要处理各种字符编码,如ASCII、宽字符(WCHAR)和Unicode。本文将详细讲解如何在UNICODE环境下,使用C++的CString类进行宽字符(WCHAR)与const char及char之间的转换。...
wchar_t * 字符串常量 (L"字符串str") wcscpy //复制字符串 wcscmp //完整的比较2个字符串 wcsncmp //在字符串中 比较n个字符 _wcsicmp //忽略大小写 比较 wcscat //拼接字串 字符相加 wcsstr //判断子字符串 ...
TCHAR是一个宏定义,它可以根据编译器的预定义宏自动选择为`char`或`wchar_t`,以适应宽字符(Unicode)和窄字符(ASCII)的环境。`cpp-texport`是一个工具,它帮助开发者自动生成与TCHAR相关的函数调用存根,使得在...
### VC++中的char, wchar_T和TCHAR详解 在VC++开发环境中,处理文本数据时,程序员经常会遇到三种字符类型:`char`、`wchar_T` 和 `TCHAR`。这些类型的选择对于确保代码的兼容性和效率至关重要。本文将详细介绍这三...