请教将char类型字符串转换成wchar_t型的方法

时间:2021-06-28 20:11:47
在使用C++ builder xe5 firemonkey库的情况下,

Combox字符串格式统统换成UnicodeString类型了,于是有下面的问题:

AnsiString astr;
wchar_t sPort[32];

aStr = "\\\\.\\";
aSstr += ComDevComBox->Items->Strings[ComDevComBox->ItemIndex].cstr();  //假设当前ComBox中选定的内容为:"COM28"

当我使用mbtowc函数时会出现下面两种情况“

int flag = mbtowc(sPort, aStr.c_str(), aStr.length());
结果Sport中转换到的字符串内容是"COM28";

当我不使用int flag这个的话接收返回值时,
mbtowc(sPort, aStr.c_str(), aStr.length());
结果Sport中转换到的字符串内容就成乱码了,而不是我想要的"\\\\.\\COM28";

请问这是什么原因呢?怎么样我可以办到修改sPort的内容为"\\\\.\\COM28"  ???

谢谢!!


第二个问题:
wchar_t sPort[100];
wcscpy(sPort, L"\\\\.\\COM28");

这样暂且造了一个sPort数据内容为:"\\.\COM28";按老版本VCL,这样可以使用CreateFile函数正确打开串口号大于10后无法打开的问题了。
但是神奇的是,当我调用CreateFile函数时,却打开不成功。这又是为什么呢?

6 个解决方案

#1


定义了数组以后,要初始化一下,如:
wchar_t sPort[32];
memset(sPort, 0x0, sizeof(sPort));

#2


char字符串和wchar_t字符串互相转换用WindowsAPI好像好一些, MultiByteToWideChar和WideCharToMultiByte这两个函数的用法一搜索就有了。

#3


但是操作总是错的,返回值不正确,不知道是什么情况。

上面的代码里有一处错误,使用函数错了,
应该使用

mbstowcs(wchar_t *dst, const char * src, size_t len);

但是我把
char src[] = "\\\\.\\COM20";
wchar_t dst[100];

mbstowcs(dst, src, sizeof(src));
结果只转换了一个字符。其它统统未转换,这是什么情况?

#4


没招,使用那个函数到底也不知道哪里出错了。

现在我改用其它方式来处理这个问题了,头疼。

UnicodeString UStr;

UStr = “\\\\.\\” +  ComDevComBox->Items->Strings[ComDevComBox->ItemIndex];

UStr.c_str()返回的是 const wchar_t *的,这样凑合用吧。正好我是用来打开串口用的。需要连接两个字符串,这样挺合适。并且通过这样的方式成功打开了COM口大于10的串口。

#5


引用 4 楼 yifei99 的回复:
没招,使用那个函数到底也不知道哪里出错了。

现在我改用其它方式来处理这个问题了,头疼。

UnicodeString UStr;

UStr = “\\\\.\\” +  ComDevComBox->Items->Strings[ComDevComBox->ItemIndex];

UStr.c_str()返回的是 const wchar_t *的,这样凑合用吧。正好我是用来打开串口用的。需要连接两个字符串,这样挺合适。并且通过这样的方式成功打开了COM口大于10的串口。



你也是使用MultiByteToWideChar函数,解决不了吗

#6


引用 5 楼 qq_27922603 的回复:
Quote: 引用 4 楼 yifei99 的回复:

没招,使用那个函数到底也不知道哪里出错了。

现在我改用其它方式来处理这个问题了,头疼。

UnicodeString UStr;

UStr = “\\\\.\\” +  ComDevComBox->Items->Strings[ComDevComBox->ItemIndex];

UStr.c_str()返回的是 const wchar_t *的,这样凑合用吧。正好我是用来打开串口用的。需要连接两个字符串,这样挺合适。并且通过这样的方式成功打开了COM口大于10的串口。



你也是使用MultiByteToWideChar函数,解决不了吗


无效,我已经放弃它了。现在使用XE10后,转换起来越来越麻烦了 ,不过就那样凑合用吧。UnString,AnsiString,服了。

#1


定义了数组以后,要初始化一下,如:
wchar_t sPort[32];
memset(sPort, 0x0, sizeof(sPort));

#2


char字符串和wchar_t字符串互相转换用WindowsAPI好像好一些, MultiByteToWideChar和WideCharToMultiByte这两个函数的用法一搜索就有了。

#3


但是操作总是错的,返回值不正确,不知道是什么情况。

上面的代码里有一处错误,使用函数错了,
应该使用

mbstowcs(wchar_t *dst, const char * src, size_t len);

但是我把
char src[] = "\\\\.\\COM20";
wchar_t dst[100];

mbstowcs(dst, src, sizeof(src));
结果只转换了一个字符。其它统统未转换,这是什么情况?

#4


没招,使用那个函数到底也不知道哪里出错了。

现在我改用其它方式来处理这个问题了,头疼。

UnicodeString UStr;

UStr = “\\\\.\\” +  ComDevComBox->Items->Strings[ComDevComBox->ItemIndex];

UStr.c_str()返回的是 const wchar_t *的,这样凑合用吧。正好我是用来打开串口用的。需要连接两个字符串,这样挺合适。并且通过这样的方式成功打开了COM口大于10的串口。

#5


引用 4 楼 yifei99 的回复:
没招,使用那个函数到底也不知道哪里出错了。

现在我改用其它方式来处理这个问题了,头疼。

UnicodeString UStr;

UStr = “\\\\.\\” +  ComDevComBox->Items->Strings[ComDevComBox->ItemIndex];

UStr.c_str()返回的是 const wchar_t *的,这样凑合用吧。正好我是用来打开串口用的。需要连接两个字符串,这样挺合适。并且通过这样的方式成功打开了COM口大于10的串口。



你也是使用MultiByteToWideChar函数,解决不了吗

#6


引用 5 楼 qq_27922603 的回复:
Quote: 引用 4 楼 yifei99 的回复:

没招,使用那个函数到底也不知道哪里出错了。

现在我改用其它方式来处理这个问题了,头疼。

UnicodeString UStr;

UStr = “\\\\.\\” +  ComDevComBox->Items->Strings[ComDevComBox->ItemIndex];

UStr.c_str()返回的是 const wchar_t *的,这样凑合用吧。正好我是用来打开串口用的。需要连接两个字符串,这样挺合适。并且通过这样的方式成功打开了COM口大于10的串口。



你也是使用MultiByteToWideChar函数,解决不了吗


无效,我已经放弃它了。现在使用XE10后,转换起来越来越麻烦了 ,不过就那样凑合用吧。UnString,AnsiString,服了。