恼人的问题,unicode 汉字 char*

大雨 2008-04-24 10:23:26
socket的API函数send只能发char *型的字符串,我将WCHAR型 的汉字用widecharTomultibyte()转换后乱码,请问有没有好的办法?
...全文
296 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
大雨 2008-04-25
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 simon031187 的回复:]
都说了不用转换就可以传
你要是非要转换的话,可以用ATL宏来转换,比WidecharToMultibyte之类的简单多了
A2W就是ANSI转UNICODE,W2A相反

C/C++ code
#include <AtlBase.h>
#include <AtlConv.h>

void func( LPWSTR lpsz )
{
USES_CONVERSION;
...
LPSTR x = W2A(lpsz)
...
}
[/Quote]
好,我现在
就去测试。
谢过楼上的,
谢过各位
simon031187 2008-04-25
  • 打赏
  • 举报
回复
都说了不用转换就可以传
你要是非要转换的话,可以用ATL宏来转换,比WidecharToMultibyte之类的简单多了
A2W就是ANSI转UNICODE,W2A相反

#include <AtlBase.h>
#include <AtlConv.h>

void func( LPWSTR lpsz )
{
USES_CONVERSION;
...
LPSTR x = W2A(lpsz)
...
}
大雨 2008-04-25
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 net_rain 的回复:]
multibyteTowidechar和widecharToMultibyte 我用了。。。出错:
buf 的类型 :wchar_t * ,已经被赋值!

WideChar ---------->MultiByte

int dwNum = WideCharToMultiByte( CP_ACP, 0 , buf, -1, NULL, NULL, NULL, NULL );
char* psText = new char[len+1];
WideCharToMultiByte( CP_ACP, 0 , buf, -1, psText, dwNum, NULL, NULL );
psText[dwNum]='\0';

说明:os:jp
[/Quote]
更正一下:
multibyteTowidechar和widecharToMultibyte 我用了。。。出错:
buf 的类型 :wchar_t * ,已经被赋值!

WideChar ---------->MultiByte

int dwNum = WideCharToMultiByte( CP_OEMCP, 0 , buf, -1, NULL, NULL, NULL, NULL );
char* psText = new char[len+1];
WideCharToMultiByte( CP_OEMCP, 0 , buf, -1, psText, dwNum, NULL, NULL );
psText[dwNum]='\0';

说明:os:jp
七里河蠢才 2008-04-25
  • 打赏
  • 举报
回复
因为unicode编码占用的位数与char的占用位数是不一样的.一个汉字要占用两个字节,您的程序中的介绍两个字中的介字是正常的,而绍字乱码,觉得可能是因为介字的编码正确的传输进和buf,但绍字处于边界,就没能正确显示.
大雨 2008-04-25
  • 打赏
  • 举报
回复
转换成窄的多字节char*的内存内容:介?
大雨 2008-04-25
  • 打赏
  • 举报
回复
错误内容: :wchar_t * buf 的类型 内存内容:介绍
错误:介?
大雨 2008-04-25
  • 打赏
  • 举报
回复
multibyteTowidechar和widecharToMultibyte 我用了。。。出错:
buf 的类型 :wchar_t * ,已经被赋值!

WideChar ---------->MultiByte

int dwNum = WideCharToMultiByte( CP_ACP, 0 , buf, -1, NULL, NULL, NULL, NULL );
char* psText = new char[len+1];
WideCharToMultiByte( CP_ACP, 0 , buf, -1, psText, dwNum, NULL, NULL );
psText[dwNum]='\0';

说明:os:jp
lessonzhe 2008-04-24
  • 打赏
  • 举报
回复
写一个unicode to ansi函数,请参考代码:

std::string UnicodeToAnsi(LPCWSTR StringW, UINT uCodePage)
{
std::string ResultA;
int nBytes = ::WideCharToMultiByte(uCodePage,
0,
StringW,
-1,
NULL,
0,
NULL,
NULL);
if (nBytes)
{
char *buf = new char[nBytes 1];
::WideCharToMultiByte(uCodePage,
0,
StringW,
-1,
buf,
nBytes,
NULL,
NULL);
ResultA = buf;
delete [] buf;
}
return ResultA;
}
herman~~ 2008-04-24
  • 打赏
  • 举报
回复
继续非要用那API 就简单做写 unicode to ansi的转换喽,不就加一函数吗
ouyh12345 2008-04-24
  • 打赏
  • 举报
回复
接收端有没有转换回来?
hastings 2008-04-24
  • 打赏
  • 举报
回复
不转也没关系把
chuengchuenghq 2008-04-24
  • 打赏
  • 举报
回复
mark
simon031187 2008-04-24
  • 打赏
  • 举报
回复
char *在这里应该看作是LPBYTE,并不是字符指针的意思,而代表的是字节缓冲区的开始
后面带了len参数,所以里面包含有0也是没关系的,UNICODE可以直接传,不用转换,不过算长度的时候要*sizeof(TCHAR)
可以参照MFC中CAsyncSocket::Send()的声明

virtual int Send(
const void* lpBuf,
int nBufLen,
int nFlags = 0
);
Treazy 2008-04-24
  • 打赏
  • 举报
回复
[Quote=引用楼主 net_rain 的帖子:]
socket的API函数send只能发char *型的字符串,我将WCHAR型 的汉字用widecharTomultibyte()转换后乱码,请问有没有好的办法?
[/Quote]

需要利用这个函数自己转换成char *

另一端再利用multibyteTowidechar将char *转换为unicode
hblinlin 2008-04-24
  • 打赏
  • 举报
回复
unicode - > utf8 -> char * -> unicode
大雨 2008-04-24
  • 打赏
  • 举报
回复
唉。。。。
大雨 2008-04-24
  • 打赏
  • 举报
回复
send 端的 buf 是 wchar 类型的,但是,send函数 的参数,只接受char* 类型的变量,buf采用widecharTomultibyte()转换后,出现乱码,比如:介绍转变后:介?


我的环境:
vs03 其中,字符集:unicode

64,654

社区成员

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

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