如何在Win32命令行应用程序中将argv转换为宽字符?

时间:2011-09-07 11:51:22

标签: c winapi unicode wchar-t codepages

我在程序中使用win32 api for C从串口读取,它似乎是相当低级别的东西。假设没有更好的方法从串口读取,CreateFile函数涉及一个LPCWSTR参数,我读过,看起来LPCWSTR是一个wchar_t类型。首先,我不太了解wchar和char之间的区别,我已经阅读了有关ansi和unicode的内容,但我真的不知道它是如何适用于我的情况的。

我的程序使用main函数,而不是wmain,需要从命令行获取参数并将其存储在wchar_t变量中。现在我知道如果我当场制作琴弦就可以做到这一点;

wchar_t variable[1024];
swprintf(variable,1024,L"%s",L"randomstringETC");

因为它看起来像L将char数组转换为wchar数组。但是当我这样做时它不起作用;

wchar_t variable[1024];
swprintf(variable,1024,L"%s",Largv[1]);

显然是因为它是语法错误。我想我的问题是,是否有一种简单的方法将普通字符串转换为wchar_t字符串?

或者有没有办法完全避免使用这种Unicode内容,并在Windows上使用C语言以串行方式读取..

3 个答案:

答案 0 :(得分:4)

没有名为CreateFile的winapi函数。有CreateFileW和CreateFileA。 CreateFile是一个,根据是否定义了_UNICODE宏,映射到其中一个实际函数。 CreateFileW采用LPCWSTR(又名const wchar_t *),CreateFileA采用LPCSTR(又名const char *)。

如果您还没有准备好转移到Unicode,那么只需显式使用CreateFileA()函数。或更改项目设置:项目+属性,常规,字符集。这是一个非零成本,底层操作系统完全基于Unicode。因此,CreateFileA()会通过一个转换层,根据当前系统代码页将const char *转换为const wchar_t *。

答案 1 :(得分:1)

MultiByteToWideChar可用于从ANSI映射到UNICODE。要进行swprintf调用,您需要定义一个wchar数组,如下所示:

WCHAR lala[256] = {0};
swprintf(lala, _countof(lala), L"%s", Largv[1]);

可以通过针对多字节字符集编译应用程序来避免unicode,但这样做是不好的做法,除非您出于遗留原因这样做。 Windows最终无论如何都需要在某些时候将其转换回unicode,因为这是底层操作系统的编码。

答案 2 :(得分:1)

L的东西只适用于字符串文字。

您需要使用类似winapi mbstowcs()函数的方法将argv字符串(可能是unsigned char)转换为wchar。