`
sealbird
  • 浏览: 590036 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

wchar 与 char 的互换

 
阅读更多
 #include <iostream>   
 #include <stdio.h>

#include <windows.h>

 using namespace std;
//#include <tchar.h>
char *w2c(char *pcstr,const wchar_t *pwstr, size_t len);
void c2w(wchar_t *pwstr,size_t len,const char *str);
int main(int argc, char* argv[])
{
wchar_t pwstr[] =L"我是中国人";
printf("===============");
wprintf(L"原始数据 pwstr:%s",pwstr);
wchar_t pwstr2[20];
    char *pcstr = (char *)malloc(sizeof(char)*(2 * wcslen(pwstr)+1));
    memset(pcstr , 0 , 2 * wcslen(pwstr)+1 );
    w2c(pcstr,pwstr,2 * wcslen(pwstr)+1) ;
	printf("wchar=>char result:%s\n",pcstr);
   c2w(pwstr2,20,pcstr);
   wprintf(L"%s",pwstr2);
    free(pcstr) ;
   return 0;
}

//将wchar_t* 转成char*的实现函数如下:

char *w2c(char *pcstr,const wchar_t *pwstr, size_t len)
{
int nlength=wcslen(pwstr);
//获取转换后的长度
int nbytes = WideCharToMultiByte( 0, // specify the code page used to perform the conversion
0,         // no special flags to handle unmapped characters
pwstr,     // wide character string to convert
nlength,   // the number of wide characters in that string
NULL,      // no output buffer given, we just want to know how long it needs to be
0,
NULL,      // no replacement character given
NULL );    // we don't want to know if a character didn't make it through the translation
// make sure the buffer is big enough for this, making it larger if necessary
if(nbytes>len)   nbytes=len;
// 通过以上得到的结果,转换unicode 字符为ascii 字符
WideCharToMultiByte( 0, // specify the code page used to perform the conversion
0,         // no special flags to handle unmapped characters
pwstr,   // wide character string to convert
nlength,   // the number of wide characters in that string
pcstr, // put the output ascii characters at the end of the buffer
nbytes,                           // there is at least this much space there
NULL,      // no replacement character given
NULL );
return pcstr ;
}
//将char* 转成wchar_t*的实现函数如下:
//这是把asii字符转换为unicode字符,和上面相同的原理
void c2w(wchar_t *pwstr,size_t len,const char *str)
{
if(str)
    {
      size_t nu = strlen(str);
      size_t n =(size_t)MultiByteToWideChar(CP_ACP,0,(const char *)str,(int)nu,NULL,0);
      if(n>=len)n=len-1;
      MultiByteToWideChar(CP_ACP,0,(const char *)str,(int)nu,pwstr,(int)n);
      pwstr[n]=0;
    }
}

//或者用此种方法更好一些:============我自已做的

//把ascii 字符转换为unicode字符

//wchar_t* Cphone_hq::ctow(wchar_t *pwstr, const char *str)
//{
//wchar_t* buffer;
//if(str)
//    {
//      size_t nu = strlen(str);
//      size_t n =(size_t)MultiByteToWideChar(CP_ACP,0,(const char *)str,int(nu),NULL,0);
//      buffer=0;
//      buffer = new wchar_t[n+1];
//      //if(n>=len) n=len-1;
//     ::MultiByteToWideChar(CP_ACP,0,(const char *)str,int(nu),buffer,int(n));    
//
//   }
//return buffer;
//delete buffer;
//}
分享到:
评论

相关推荐

    普通字符与Unicode代码互换

    本篇文章将深入探讨如何在C++Builder 2010环境下实现普通字符与Unicode编码之间的互换。 首先,理解Unicode的基础知识是必要的。Unicode 使用一个唯一的数字(码点)来代表每个字符,这个数字通常用16进制表示。...

    vc++中各种字符串含义和转换大全.pdf

    LPSTR是“Long Pointer to String”的缩写,它是一个指向以NULL结尾的ANSI字符数组的指针,可与char*互换使用。LPCSTR是“Long Pointer to Constant String”的缩写,增加了常量的含义,表明指向的字符串不应被修改...

    VC++中字符串的处理

    - **LPSTR**:是一个指向以`\0`结尾的ANSI字符数组的指针,与`char*`可以互换使用。 - **LPCSTR**:增加了`C` 的含义,表示该指针指向的字符串是只读的,不能被修改。这通常用于函数参数中,以确保字符串不会被意外...

    CString操作指南

    - **`CString`与`VARIANT`的转换**:`VARIANT`是OLE自动化中用于存储各种数据类型的通用容器,`CString`提供了转换机制,使其能够与`VARIANT`类型互换数据。 #### 4. 资源字符串加载 `CString`还支持直接从资源...

    VC中各种数据类型转换

    它可以与C++的 `unsigned short` 类型互换。在处理二进制数据或网络协议时,`WORD` 用于表示较小的数值,如端口号或颜色索引。 在VC中进行数据类型转换时,需要根据具体场景选择合适的转换方式。例如,`CString` 和...

    GBK,unicode,utf-8 conversion.rar

    2. `utf8_to_unicode(unsigned char* utf8Str, wchar_t* unicodeStr)`: 这个函数将UTF-8字符串转换为宽字符(Unicode)字符串。UTF-8是变长编码,所以需要根据每个字节的最高位来确定字符的长度,然后将这些字节组合...

    c/c++笔记,面试必看,自己总结整理

    - `_tmain()`的定义通常为`int _tmain(int argc, _TCHAR* argv[])`,这里的`_TCHAR`是一个模板类型,根据编译器设置的不同,它可以是`char`或`wchar_t`,以支持不同的字符编码。 4. **返回值**: - `main()`的...

    VC常用数据类型转换.doc

    在非Unicode配置下,LPSTR和LPWSTR可以通过预处理器定义互换,以适应不同的字符集。 2. **CString、CStringA 和 CStringW** - **CString**是ATL和MFC中的通用字符串类,它可以操作不同类型的字符。在Unicode环境下...

    CString使用

    5. **兼容性**:`CString`可以与`const char*`和`LPCTSTR`类型的函数参数互换使用。 6. **直接访问**:`CString`提供转换操作符,使得可以直接访问字符串中的字符,就如同访问一个只读的C风格字符串数组一样。 7. ...

Global site tag (gtag.js) - Google Analytics