关于char*转换wchar_t*的问题

_G_M_000 2018-02-13 12:50:44
敲代码时候每次敲 wchar_t * w =L"中文abc" 的时候总是必须要前置L字母,不然编译器报错。
而在Qt中可以 QString s = "中文abc"; 无需前置L字母,安全无污染。
所以楼主希望能自己实现该功能,嘿嘿。

#include <iostream>
wchar_t * char_wchar()
{
//char * 转换 wchar_t *
//大概方法就是先
char * c = "中文abc";
//然后想办法转换成 wchar_t * w
wchar_t * w = ( wchar_t * ) c ;//该行代码错误的
//求补全代码!
//求补全代码!
//求补全代码!
return w;
}
int main()
{
setlocale(LC_ALL, "");

char * c = "中文char *\r\n";
printf(c);

wchar_t * w = L"中文wchar_t *\r\n";
wprintf(w);

wprintf( char_wchar() );//print失败

getchar();
}


楼主为此百度谷歌了好多办法,均难以实现,其中原理也理解了七七八八。
但是恕楼主愚笨,虽然网上很多大神讲了很多,但楼主根本看不明白,
所以望各位大神干脆利落给个痛快的。

最后,某赵4及其粉丝禁止留言,不想骂人,不解释

...全文
1904 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
好想长大 2020-01-27
  • 打赏
  • 举报
回复


void char_wchar(char * str, wchar_t * ret, int len)
{
  int i;
  for(i=0;i<len;i++){
    ret[i]=(wchar_t)str[i]
  }
}
试下
谁学逆向工程 2018-02-14
  • 打赏
  • 举报
回复
MulbyteToWidtChar
WlxXEGLFntcI6FWv 2018-02-14
  • 打赏
  • 举报
回复
手动 的手动手动
_G_M_000 2018-02-13
  • 打赏
  • 举报
回复
引用 17 楼 zilaishuichina 的回复:
说实话,楼主的逻辑有点乱 首先,lz如果是觉得中文字符串前面加L不爽,你完全可以不用wchar来存,用char一样可以存中文,比如你自己写的代码里就有写char * c = "中文char *\r\n",没有人强制说中文一定要存在wchar中。 其次,lz说QString s = "中文abc"; 无需前置L字母。你举的这个例子,貌似并不能说明QString实现了:将一个字符串赋值给wchar的指针时,赋值可以不加L这个功能。如果QString就有一个构造函数,参数就是char*呢?QString s = "中文abc",如果它调用的是参数类型为char*那个构造函数呢? 第三,如果抛开前两条不管,lz只是想自己实现一个char转wchar的功能,系统有提供好的函数 mbstowcs,你可以搜一下,你也可以参考这个帖子里的StringTool::MbStrToWcStr,示例代码,仅供参考:
	char * c = "中文char *\r\n";
	printf(c);

	wchar_t * w = L"中文wchar_t *\r\n";
	wprintf(w);

	std::wstring ws = StringTool::MbStrToWcStr(c, L"zh_CN.GBK");
	wprintf(ws.c_str());
原来char一样可以存中文,楼主我一直以为这是编译器只是为了兼容不报警而已,还有谢谢大神提供的代码,照搬啦
_G_M_000 2018-02-13
  • 打赏
  • 举报
回复
最后公布答案: 在楼主的vs2008里,使用UTF-8编码,其它情况尚未研究。 前置setlocale(LC_ALL, "");代码,虽然不知道参数实际是什么意思。 然后mbstowcs_s或者MultiByteToWideChar都可以实现。 然后setlocale(LC_ALL, "");有时候可以不用,看编译器的具体配置吧
#include <iostream>
#include <Windows.h>

wchar_t * pchar_pwchar(char * pchar)
{
	size_t len = strlen(pchar) + 1;
	wchar_t * pwchar =
		(wchar_t*)malloc(len*sizeof(wchar_t));
	mbstowcs_s( 0, pwchar, len, pchar, _TRUNCATE);
	return pwchar;
}

wchar_t * char_wchar(char * str)
{
	int size = MultiByteToWideChar(CP_ACP,0,str,-1,NULL,0);   
	wchar_t *ch = new wchar_t[size+1];  
	MultiByteToWideChar(CP_ACP,0,str,-1,ch,size); 

	return ch;
}

int main()
{
	setlocale(LC_ALL, "");

	char * c = "中文char *\r\n";
	printf(c);

	wchar_t * w = char_wchar( c );
	wprintf(w);

	getchar();
}
_G_M_000 2018-02-13
  • 打赏
  • 举报
回复
引用 14 楼 donjin9 的回复:
自己造个string类,C++的几乎都干过吧。
造过,但是不知道怎么string s = "中文abc",所以才有此贴
zilaishuichina 2018-02-13
  • 打赏
  • 举报
回复
说实话,楼主的逻辑有点乱 首先,lz如果是觉得中文字符串前面加L不爽,你完全可以不用wchar来存,用char一样可以存中文,比如你自己写的代码里就有写char * c = "中文char *\r\n",没有人强制说中文一定要存在wchar中。 其次,lz说QString s = "中文abc"; 无需前置L字母。你举的这个例子,貌似并不能说明QString实现了:将一个字符串赋值给wchar的指针时,赋值可以不加L这个功能。如果QString就有一个构造函数,参数就是char*呢?QString s = "中文abc",如果它调用的是参数类型为char*那个构造函数呢? 第三,如果抛开前两条不管,lz只是想自己实现一个char转wchar的功能,系统有提供好的函数 mbstowcs,你可以搜一下,你也可以参考这个帖子里的StringTool::MbStrToWcStr,示例代码,仅供参考:
	char * c = "中文char *\r\n";
	printf(c);

	wchar_t * w = L"中文wchar_t *\r\n";
	wprintf(w);

	std::wstring ws = StringTool::MbStrToWcStr(c, L"zh_CN.GBK");
	wprintf(ws.c_str());
_G_M_000 2018-02-13
  • 打赏
  • 举报
回复
引用 13 楼 luciferisnotsatan 的回复:
从12楼赵4的回复来看,这是个机器人吧,不然就是个精神分裂症。。。 很久以前就注意到了。经常答非所问,就算精神病人也不会这么神经的。-----来自楼主在精神病院当主治医生的亲戚评价。 人工AI如今也不是什么稀罕技术了,有能力的还是能做出来的. 最后,论坛的验证码真难打。
luciferisnotsatan 2018-02-13
  • 打赏
  • 举报
回复
引用 11 楼 GM_000 的回复:
[quote=引用 9 楼 luciferisnotsatan 的回复:]
所以我应该想办法配置utf-8编码,也许要用到setlocale(LC_ALL, "");这行代码,虽然我不知道这行代怎么起作用的,然后配合MultiByteToWideChar使用,我先试试看[/quote] 你可以去了解下 “字符集” 概念 setlocal只是运行时设置环境,让printf能显示出中文,应该原本就是段中文码(比如GB),如果没设置的话,显示出来的可能就是乱码。 另外,我记得以前调试过,用VC提供的宽字符系列函数,比如wprintf,这函数内部最终会把wchar转成本地(也就是setlocale指定的字符编码)的char,然后显示出来。所以,你要用VC的话,编码转换你必须自己动手。用QT,QT用简单的策略(只用utf-8)做了多国语言的支持。
donjin9 2018-02-13
  • 打赏
  • 举报
回复
自己造个string类,C++的几乎都干过吧。
luciferisnotsatan 2018-02-13
  • 打赏
  • 举报
回复
引用 8 楼 GM_000 的回复:
[quote=引用 6 楼 luciferisnotsatan 的回复:] 赵4的风格,10年不变。还有人知道 “复制帝” 这个称号么?
10年[/quote] 10年一个风格,最多就是回复种类变多了。以前翻来覆去就那么几段,比如 字符串那些事儿:BSTR-LPSTR-LPWSTR-CString-VARIANT-COleVariant-_variant_t-CComBSTR-_bstr_t http://blog.csdn.net/pizi0475/archive/2010/03/04/5346708.aspx VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。 (Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。) -------------------------------------------------------------------------------- 计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… bc++3.1 帮助里面对每个函数都有一小段能拷贝出来运行看效果的例子程序。非常适合初学C语言。相比较而言VC带的帮助MSDN就没有。http://download.csdn.net/source/2805028 ---------------------------------------------------------------------------------- 英语也是一门计算机语言的说。 对学习编程者的忠告: 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步对应汇编一行! 那是还有人注册了山寨名字,挂着山寨头像,复制发送这些话,恶搞赵老湿
赵4老师 2018-02-13
  • 打赏
  • 举报
回复
谁敢说不可能通过逆向+Hook技术把VS编译器CL.exe改造成“...”表示USC-2字符串常量,而L"..."表示ANSI字符串常量?!
_G_M_000 2018-02-13
  • 打赏
  • 举报
回复
引用 9 楼 luciferisnotsatan 的回复:
所以我应该想办法配置utf-8编码,也许要用到setlocale(LC_ALL, "");这行代码,虽然我不知道这行代怎么起作用的,然后配合MultiByteToWideChar使用,我先试试看
luciferisnotsatan 2018-02-13
  • 打赏
  • 举报
回复
引用 9 楼 luciferisnotsatan 的回复:
Qt里面,只用utf-8编码来保存代码文件。 VS里默认是你本地的区域语言设置。可以自己配置。VS里,如果只名了L,那么指名用宽字符USC-2 还是 USC-4来着。 就像ls说的,你需要转编码。你要知道你当前char*里保存的是什么编码,GB,JBK,latin-1之类的,然后通过MultiByteToWideChar转成wchar,或者反过来
指明 L"abc",那么编译器吧这个abc用USC-4来编译。否则就是本地语言设置
luciferisnotsatan 2018-02-13
  • 打赏
  • 举报
回复
Qt里面,只用utf-8编码来保存代码文件。 VS里默认是你本地的区域语言设置。可以自己配置。VS里,如果只名了L,那么指名用宽字符USC-2 还是 USC-4来着。 就像ls说的,你需要转编码。你要知道你当前char*里保存的是什么编码,GB,JBK,latin-1之类的,然后通过MultiByteToWideChar转成wchar,或者反过来
_G_M_000 2018-02-13
  • 打赏
  • 举报
回复
引用 6 楼 luciferisnotsatan 的回复:
赵4的风格,10年不变。还有人知道 “复制帝” 这个称号么?
10年
_G_M_000 2018-02-13
  • 打赏
  • 举报
回复
引用 5 楼 hdt 的回复:
msdn search WideCharToMultiByte api
是啊是啊 就这几个短短的字母胜似千言万语了都
luciferisnotsatan 2018-02-13
  • 打赏
  • 举报
回复
赵4的风格,10年不变。还有人知道 “复制帝” 这个称号么?
真相重于对错 2018-02-13
  • 打赏
  • 举报
回复
msdn search WideCharToMultiByte api
_G_M_000 2018-02-13
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
先修改Tiny C Compiler或gcc/g++编译器相关设置或处理常量字符串相关源代码片断,再用Tiny C Compiler或gcc/g++编译生成。 因为VS系列的编译器源代码不公开,那只好逆向+Hook了。
我的是VS系列编译器,逆向+Hook是什么鬼?
加载更多回复(3)

64,282

社区成员

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

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