4

我在我的程序中使用 C 的 win32 api 从串行端口读取,这似乎是相当低级的东西。假设没有更好的从串行端口读取的方法,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以另一种方式从串行读取..

4

3 回答 3

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*。

于 2011-09-07T12:19:09.923 回答
1

MultiByteToWideChar可用于从 ANSI 映射到 UNICODE。要swprintf拨打电话,您需要定义一个wchar这样的数组:

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

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

于 2011-09-07T11:58:05.810 回答
1

L 东西仅适用于字符串文字。

您需要使用类似 winapimbstowcs()函数的东西将 argv 字符串(可能是 unsigned char)转换为 wchar。

于 2011-09-07T12:00:56.193 回答