使用 InternetSetOption 函数使用 unicode 字符设置代理 URL
Posted
技术标签:
【中文标题】使用 InternetSetOption 函数使用 unicode 字符设置代理 URL【英文标题】:Setting Proxy URL with unicode characters using InternetSetOption function 【发布时间】:2013-07-01 18:01:08 【问题描述】:我被一个问题困扰了很长一段时间。
Windows 用户帐户名包含其中一些字符(Ö、Ü、Ä)。编辑:即使是汉字。所以基本上是ASCII未涵盖的字符。 我有一个代理 pac 文件存储在 %appdata%\MyAppFolder 中。 - 扩展后的路径包含一些特殊字符,如上面提到的。
我必须在
中设置这条路径IE->InternetOptions->Connections->LAN设置->使用自动配置脚本
This translates to:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\AutoConfigURL in the registry.
代码摘录:
wchar_t wzsPath[MAX_PATH];
wchar_t wszProxyUrl[INTERNET_MAX_URL_LENGTH];
SHGetFolderPath ( NULL, CSIDL_APPDATA | CSIDL_FLAG_CREATE, NULL, 0, wszPath );
// Construct Pac file path. – %appdata%\MyAppFolder\redirect.pac
StringCbPrintf (wszProxyUrl, sizeof(wszProxyUrl),
L"file://%s\\MyAppFolder\\redirect.pac", wszPath );
INTERNET_PER_CONN_OPTION_LIST *optionList = 0;
optionList->pOptions[INDEX].Value.pszValue = wszPath;
InternetSetOption ( NULL, INTERNET_OPTION_PER_CONNECTION_OPTION,
optionList, sizeof(INTERNET_PER_CONN_OPTION_LIST) );
问题是InternetSetOption设置的路径在Registry位置不正确。
例如,字符串“TestÖ”在注册表中设置为“TestÖ”。 IE9 在浏览器中设置文本,但没有任何帮助。 IE10 在注册表中设置垃圾值。 这会导致网络访问中断。
【问题讨论】:
ASCII 字符的值在 0 到 127 之间。显然 153、154 和 142 不是 ASCII 的一部分。就目前而言,您的问题不是问题,因为事实都是错误的。更重要的是,您没有给我们任何代码,以便我们可以实际计算出这些值的来源。 谢谢大卫。我被link Extended ASCII 部分难住了。虽然在控制台上打印需要这个(扩展 ascii 值),但在 MessageBox/Debug String 中打印字符会读取 html 代码页值。 我会尽快添加一些有意义的代码摘录。 Windows 不使用那个特定的扩展 ascii 表。本机 Windows 编码是 UTF-16 Unicode。调用 Windows API 的 Unicode 版本就可以了。 【参考方案1】:InternetSetOption
是一个相当普通的 Win32 函数。它有两种风格,ANSI 和 Unicode 版本。之所以需要这些不同的版本,是因为 Windows 95/98/ME 不支持 Unicode,只支持 8 位编码。由于您可以放心地忽略那些古老版本的 Windows,因此您可以使用 Unicode 版本的 Win32 API。
在您的情况下,这意味着您确保将应用程序编译为以 Unicode 为目标。这将确保 InternetSetOption
映射到 InternetSetOptionW
,即使用 UTF-16 编码的 Unicode 版本。
您的字符数组应使用 Windows 16 位字符类型wchar_t
作为基本字符类型。你不能使用char
,因为那是 8 位的。
我不确定此更改是否会解决您的实际问题,因为问题不清楚且缺乏详细信息。但是,上述建议是您需要执行的操作才能在您的程序中正确支持国际字符。
【讨论】:
感谢您的回复。我被这些扩展的 ascii 值误导了。问题实际上在于所有值> 127的字符。这是代码摘录。 ` SHGetFolderPath (NULL, CSIDL_APPDATA | CSIDL_FLAG_CREATE, NULL, 0, wszPath); INTERNET_PER_CONN_OPTION_LIST *optionList = 0; optionList->pOptions[INDEX].Value.pszValue = wszPath; InternetSetOption (NULL, INTERNET_OPTION_PER_CONNECTION_OPTION, optionList, sizeof(INTERNET_PER_CONN_OPTION_LIST)); ` 我想我已经尽可能地回答了你原来的问题。你还需要什么? 是的。您的回复有助于清除我的错误线索。已经对我的问题进行了相当多的编辑。希望它更清楚。optionList
是一个空指针。你永远不会将它指向一个有效的对象。您的代码中也没有错误检查。您需要检查每个 API 调用的返回值。
我正在为 optionList 分配内存。调用了一个分配函数来完成这项工作。我还在检查所有 API 的所有返回值。任何地方都没有错误。还对传递给 InternetSetOption 函数的每个字符进行十进制值检查。一切都是精确的。以上是关于使用 InternetSetOption 函数使用 unicode 字符设置代理 URL的主要内容,如果未能解决你的问题,请参考以下文章
WinInet::InternetSetOption(...) 总是返回 0 并且 GetLastError() 返回 12018
无法从 WinForms 应用程序设置 WinInet 代理