微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将多字节数组转换为 Unicode

如何解决将多字节数组转换为 Unicode

我正在使用 Visual Studio 2019 在通用 Windows 程序中使用 WinInet 创建 FTP 下载器。

Visual Studio 2019 没有提供在属性配置选项卡中更改字符集的选项。

我需要将以下多字节格式的内容转换为 Unicode:

CHAR * szHead[] = "Accept: */*\r\n\r\n";

整个代码来自以前使用具有多字节字符集选项的编译器的旧项目,并且按原样运行良好。不幸的是,我需要在支持 Windows 应用商店的编译器中完成这项工作,该编译器只有 Unicode。

if (!(hConnect = InternetopenUrlW(hOpen,szUrl,szHead,strlen(szHead),INTERNET_FLAG_DONT_CACHE,0)))

我收到以下错误

Error (active)  E0520   initialization with '{...}' expected for aggregate object   
Error   C2440   'initializing': cannot convert from 'const wchar_t [16]' to 'LPCTSTR []'    
Error   C2664   'size_t strlen(const char *)': cannot convert argument 1 from 'LPCTSTR []' to 'const char *'    

从其他研究来看,这些错误的产生是因为编译器期望使用 Unicode,但是却得到了多字节。

解决方法

首先,CHAR * szHead[] = "Accept: */*\r\n\r\n"; 不会编译。您正在尝试使用单个常量指针初始化非常量指针数组。您需要改用它:

CHAR szHead[] = "Accept: */*\r\n\r\n";`

或者这个:

const CHAR * szHead = "Accept: */*\r\n\r\n";

话虽如此,InternetOpenUrlW() 需要 WCHAR 字符串(因此名称中包含 W),而不是 CHAR 字符串。您是否考虑过简单地使用 InternetOpenUrlA() 代替?

CHAR szHead[] = "Accept: */*\r\n\r\n";

if (!(hConnect = InternetOpenUrlA(...,szHead,-1,)))

如果这不是一个选项,那么您将不得不:

  • 使用 MultiByteToWideChar()(或等效的)将 CHAR 字符串转换为 WCHAR 字符串,例如:
CHAR szHead[] = "Accept: */*\r\n\r\n";
WCHAR wszHead[16];
...
MultiByteToWideChar(CP_ACP,wszHead,_countof(wszHead));
if (!(hConnect = InternetOpenUrlW(...,...)))
  • 或者简单地使用 WCHAR 字符串开头,例如:
WCHAR szHead[] = L"Accept: */*\r\n\r\n";
...
if (!(hConnect = InternetOpenUrlW(...,...)))
,

这解决了错误信息

LPCWSTR szHead = L"接受:/\r\n\r\n";

我不知道程序是否有效,因为我得到 3 个未解析的外部对象。如果我从链接器取消链接 Wininet.lib,我会在 Visual Studio 6.0 中得到完全相同的错误消息。

我需要找到一种在 Wininet.lib 中进行链接的方法,但是这个编译器没有给你任何明显或简单的方法来做到这一点。我说的是visual studio 2019社区版

,

实际上,您可以在 Visual Studio 2019 中添加 wininet.lib。您可以添加现有项目并导航到 vc98 lib 文件夹,然后单击 wininet.lib,编译器将其直接放入构建中,错误消失了。不幸的是,您似乎无法使用在商店项目中下载其他代码的代码,因为我发现该应用在下载开始时中止并显示不支持操作。使用 c# 下载文件有更简单、更当前的方法,但即使使用当前代码简单的 C# 代码,当下载开始说不支持操作时,应用程序也会中止

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。