使用InternetSetOption函数使用unicode字符设置代理URL

时间:2013-07-01 18:01:08

标签: c winapi character-encoding special-characters wininet

我在问题上遇到了一段时间。

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设置的路径在注册表位置不正确。

例如,字符串“TestÖ”在注册表中设置为“TestÃ-”。 IE9在浏览器中设置文本,但没有任何帮助。 IE10在注册表中设置垃圾值。 这导致网络访问中断。

1 个答案:

答案 0 :(得分:0)

InternetSetOption是一个相当正常的Win32函数。它有两种版本,ANSI和Unicode版本。对这些不同版本的需求来自于Windows 95/98 / ME不支持Unicode并且仅支持8位编码的事实。由于您可以安全地忽略这些古老版本的Windows,因此可以使用Win32 API的Unicode版本。

在您的情况下,这意味着您确保将应用程序编译为目标Unicode。这将确保InternetSetOption映射到InternetSetOptionW,即使用UTF-16编码的Unicode版本。

您的字符数组应使用Windows 16位字符类型wchar_t作为基本字符类型。您不能使用char,因为它是8位。

我不确定此更改是否会解决您的实际问题,因为问题不明确且缺乏细节。但是,上述建议是您需要做的才能在程序中正确支持国际字符。

相关问题