wchar_t* 与 char* 转换

lookfeng 2006-08-03 05:53:55
例如:char* a = "你好";
怎么让wchar_t* b 等于a

b[0] = 你
b[1] = 好
...全文
1642 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
lookfeng 2006-08-17
  • 打赏
  • 举报
回复
就上面问题再顶一下:

char* a = "你好ab";
wchar_t* b;

怎么让:
b[0] = C4E3 //即 你 的GB2312 码
b[1] = BAC3 //即 好 的GB2312 码
b[2] = 97 //即 a 的GB2312 码
b[3] = 98 //即 b 的GB2312 码

AdenPlus 2006-08-17
  • 打赏
  • 举报
回复
说的好,自己赋个值不就行了!
zengkun100 2006-08-17
  • 打赏
  • 举报
回复
多字节编码和UNICODE编码根本就是两个不同的东西嘛!
你非要两个的内存一样搞什么呢?建议你去看看WINDOWS核心编程,看看里面是怎么讲UNICODE的。
plamlover 2006-08-17
  • 打赏
  • 举报
回复
上面程序写错了~~~~
刚才调试了一下~~~~~~
用的是VC6.0
#include<windows.h>
#include<stdio.h>
void main()
{
char* a = "你好",*Lpa,*Lpb;
wchar_t b[2] ;
int i;
Lpa=a; //之前这明显出问题了
Lpb=&b;
for(i=0;i<2*2;i++,Lpa++,Lpb++) //可以达到要求
{
*Lpb=*Lpa;
}
*Lpb='\0'; //为了输出结果再加上一个尾巴
printf("%s",(char*)b); //输出“你好”
}
plamlover 2006-08-17
  • 打赏
  • 举报
回复
例如:char* a = "你好";
怎么让wchar_t* b 等于a

b[0] = 你
b[1] = 好
-----------------------------------------------------
我想讲一点原理性的东西,wchar_t 一个字符占二个字节(这其实是UNICODE),一个汉字也占二个字节。。如果是用WINDOWS API函数来解决应该是没有什么问题的,在WINDOWS里面扩展的C运行库也有相应的函数可以解决这种问题,具体可以MSDN中查到(我也不太记了)。

void main()
{
char* a = "你好",*Lpa,*Lpb;
wchar_t b[2] ;
int i;
Lpa=&a;
Lpb=&b;
for(i=0;i<2*2;i++,Lpa++,Lpb++)
{
*Lpb=*Lpa;
}
我认为这样就达到要求了。(没有要API)
Cocoky 2006-08-17
  • 打赏
  • 举报
回复
multichartowidechar
widechartomultichar
低调的小青蛙 2006-08-17
  • 打赏
  • 举报
回复
使用
int _ismbslead( const unsigned char *string, const unsigned char *current );
int _ismbstrail( const unsigned char *string, const unsigned char *current );

分别可以判断某一个字节,是否是一个汉字的第一个字节和后一个字节。

搂主可以参考其他的 mbs 系列函数
lookfeng 2006-08-15
  • 打赏
  • 举报
回复
看样子高手是不会出现了。
lookfeng 2006-08-15
  • 打赏
  • 举报
回复
在一个问题:

char* a = "你好";
wchar_t* b;

怎么让:
b[0] = C4E3 //即 你 的GB2312 码
b[1] = BAC3 //即 好 的GB2312 码

低调的小青蛙 2006-08-15
  • 打赏
  • 举报
回复
To sharpdew(风刃) 兄:

直接否定 mbstowcs 是不对的。实际上 mbstowcs() 是和 setlocale() 相关联的,这一点容易被忽略。当 setlocale() 运行正确之后,mbstowcs() 是能够起作用的。

实际上 mbstowcs() 才是最正统的 C++ 方法,所有的 C++ 都支持。Windows API 方法是最好用的,不过只有在 Windows 下才能用。如果是在 Windows 上写程序,当然推荐使用 Windows API 方法。
sharpdew 2006-08-15
  • 打赏
  • 举报
回复
mbstowcs这样用是不对的,它会把输入的char*字符串中的每个char(一个汉字对应两个char)都转化为对应的wchar类型,在上面的例子中实际上就是在本来的char前面补充一个全为0的字节。要在linux下转化gbk为unicode需要使用iconv函数,windows下当然就用MultiByteToWideCha和WideCharToMultiByte。
值得注意的是,不管是gbk字符,还是unicode字符,在使用iconv进行转化的时候,都是以char*的格式进行封装的,也就是说如果是宽字符的话需要两个两个取char数组中的字符,然后按照系统是little endia还是big endian的顺序把每成对的两个char,当作一个wchar来看待,或者把两个char对应的内存看作一个unsigned short的内存,一个字节占前面8为,另外一个字节占后面8位。
低调的小青蛙 2006-08-15
  • 打赏
  • 举报
回复
#include <locale.h>
#include <stdlib.h>

int main(int argc, char* argv[])
{
char * a = "你好";
wchar_t b[10] = {0};

setlocale(LC_ALL, "");

mbstowcs(b, a, 10);

return 0;
}
低调的小青蛙 2006-08-15
  • 打赏
  • 举报
回复
使用 mbstowcs 之前,需要进行

// 位于头文件 <locale.h> 中,这个头文件是标准 C++ 头文件,肯定有,不管哪个 C++
setlocale(LC_ALL, "");

在我提到的文章中,有相关讲述,并且讲解了相关的原理:
http://www.regexlab.com/zh/encoding.htm


另外,如果使用 Windows API 函数,可以使用 MultiByteToWideChar

使用强类型转换的方法肯定是错的,不用考虑。

lookfeng 2006-08-15
  • 打赏
  • 举报
回复
因为我的问题没有解决:


1、问题一:

char* a = "你好";
怎么让wchar_t* b 等于a

b[0] = 你
b[1] = 好

用mbstowcs

b为四个字符(不算\0):
分别等于
196 227 186 195
即1、2组成你,3、4组成好

而我想:
b为两个字符:
b[0] = 20320 //你
b1[] = 22909 //好

2、问题二:
char* a = "你好";
wchar_t *b = (wchar_t *)a;

得出来的
b为乱麻,察看
b[0] = E3C4
b[1] = C3BA

你好 的GB2312码:
你 C4E3
好 BAC3

所以这样强制转换后,
得出来是GB2312码高低位对调了。

这种对调是由具体实现(编译器)确定的,还是所有编译器都设这样的?
低调的小青蛙 2006-08-15
  • 打赏
  • 举报
回复
搂主这样子说就不好了,前面都已经说得非常明白了。

详情请看:
http://www.regexlab.com/zh/encoding.htm
Jedimaster 2006-08-12
  • 打赏
  • 举报
回复
如果要手动转换应该要考虑高位低位吧

毕竟w_char是unsigned short
zengkun100 2006-08-12
  • 打赏
  • 举报
回复
这肯定是字符编码之间的转换,而不仅仅是内存的转换,你需要调函数的,楼上的已经说了函数了。
lookfeng 2006-08-11
  • 打赏
  • 举报
回复
再顶
低调的小青蛙 2006-08-07
  • 打赏
  • 举报
回复
正统的 C++ 用法是:mbstowcs ,在 Windows 下可以使用 Windows API 函数:MultiBytesToWideChars。

关于字符编码的更多讨论:
http://www.regexlab.com/zh/encoding.htm
lookfeng 2006-08-07
  • 打赏
  • 举报
回复
欢迎继续讨论!

另外,

char* a = "你好";
wchar_t *b = (wchar_t *)a;

得出来的
b为乱麻,察看
b[0] = E3C4
b[1] = C3BA

你好 的GB2312码:
你 C4E3
好 BAC3

所以这样强制转换后,
得出来是GB2312码高低位对调了。

能不能不让它对调?

加载更多回复(8)

64,647

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧