UrlEscapeW 函数 (shlwapi.h)
将 URL 中的字符或代理项对转换为其相应的转义序列,这些 URL 在 Internet(“不安全”字符)传输过程中可能会更改。 代理项对是 U+10000 到 U+10FFFF(在 UTF-32 中)或 DC00 到 DFFF(在 UTF-16 中)之间的字符。
语法
LWSTDAPI UrlEscapeW(
[in] PCWSTR pszUrl,
[out] PWSTR pszEscaped,
[in, out] DWORD *pcchEscaped,
DWORD dwFlags
);
参数
[in] pszUrl
类型:PCTSTR
一个长度为 null 的字符串,INTERNET_MAX_URL_LENGTH 包含完整或部分 URL,适合 dwFlags中的值。
[out] pszEscaped
类型:PTSTR
接收转换后的字符串的缓冲区,并将不安全字符转换为其转义序列。
[in, out] pcchEscaped
类型:DWORD*
指向 DWORD 值的指针,该值在条目中包含 pszEscaped 缓冲区中的字符数。 在调用 urlEscape
如果返回E_POINTER错误代码,则缓冲区太小而无法保存结果,并且由 pcchEscaped 引用的值设置为缓冲区中所需的字符数。 如果返回任何其他错误,则未定义由 pcchEscaped 引用的值。
dwFlags
类型:DWORD
指示 pszURL 中提供 URL 部分的标志,以及该字符串中的哪些字符应转换为其转义序列。 定义了以下标志。
URL_DONT_ESCAPE_EXTRA_INFO(0x02000000)
仅用于与 URL_ESCAPE_SPACES_ONLY 一起使用,以防止在查询中转换字符(字符串中遇到第一个 # 或 ? 字符后的 URL 部分)。 不应单独使用此标志,也不应与 URL_ESCAPE_SEGMENT_ONLY结合使用。
URL_BROWSER_MODE
定义为与 URL_DONT_ESCAPE_EXTRA_INFO相同。
URL_ESCAPE_SPACES_ONLY(0x04000000)
仅将空格字符转换为转义序列,包括 URL 查询部分中的这些空格字符。 其他不安全字符不会转换为其转义序列。 此标志假定 pszURL 不包含完整 URL。 它仅需要服务器规范后面的部分。
将此标志与 URL_DONT_ESCAPE_EXTRA_INFO 合并,以防止在 URL 的查询部分中转换空格字符。
此标志不能与 URL_ESCAPE_PERCENT 或 URL_ESCAPE_SEGMENT_ONLY结合使用。
URL_ESCAPE_PERCENT(0x00001000)
转换 URL 段(该部分位于服务器规范与第一个 # 或 ? 个字符之间)中找到的任何 % 字符。 默认情况下,% 字符不会转换为其转义序列。 段中的其他不安全字符也会正常转换。
将此标志与 URL_ESCAPE_SEGMENT_ONLY 组合在 URL 的查询部分中包括这些 % 字符。 但是,由于 URL_ESCAPE_SEGMENT_ONLY 标志会导致整个字符串被视为段、任何 # 或 ? 字符也会转换。
此标志不能与 URL_ESCAPE_SPACES_ONLY结合使用。
URL_ESCAPE_SEGMENT_ONLY(0x00002000)
指示 pszURL 仅包含服务器组件后面的 URL 节,但在查询之前。 将转换字符串中的所有不安全字符。 如果在设置此标志时提供了完整的 URL,则会转换整个字符串中的所有不安全字符,包括 # 和 ? 字符。
将此标志与 URL_ESCAPE_PERCENT 合并,以在转换中包含该字符。
此标志不能与 URL_ESCAPE_SPACES_ONLY 或 URL_DONT_ESCAPE_EXTRA_INFO结合使用。
URL_ESCAPE_AS_UTF8(0x00040000)
Windows 7 及更高版本。 将所有非 ASCII 字符的百分比编码为其 UTF-8 等效字符。
URL_ESCAPE_ASCII_URI_COMPONENT(0x00080000)
Windows 8 及更高版本。 从 URI RFC 3986(a-zA-Z0-9-.~_)中未保留集之外的所有 ASCII 字符进行百分比编码。
返回值
类型:HRESULT
如果成功,则返回S_OK。 如果 pcchEscaped 缓冲区太小而无法包含结果,则返回E_POINTER,并且 pcchEscaped 指向的值设置为所需的缓冲区大小。 否则,将返回标准错误值。
言论
出于本文档的目的,典型的 URL 分为三个部分:服务器、段和查询。 例如:
http://microsoft.com/test.asp?url=/example/abc.asp?frame=true#fragment
服务器部分为“http://microsoft.com/"。 尾部正斜杠被视为服务器部分的一部分。
段部分是在服务器部分之后找到的路径的任何部分,但在第一个 # 或之前? 字符,在本例中只是“test.asp”。
查询部分是第一个 # 或 ? 字符(含)到末尾。 在此示例中,它是“?url=/example/abc.asp?frame=true#fragment”。
不安全字符是在 Internet 传输过程中可能更改的字符。 此函数将不安全字符转换为其等效的“%xy”转义序列。 下表显示了不安全字符及其转义序列。
字符 | 转义序列 |
---|---|
^ | %5E |
& | %26 |
` | %60 |
{ | %7B |
} | %7D |
| | %7C |
] | %5D |
[ | %5B |
" | %22 |
< | %3C |
> | %3E |
\ | %5C |
使用 URL_ESCAPE_SEGMENT_ONLY 标志也会导致 #(%23), 的转换? (%3F)和/(%2F)字符。
默认情况下,UrlEscape 忽略 #或 ? 字符。 URL_ESCAPE_SEGMENT_ONLY 标志通过将整个字符串视为段来替代此行为。 URL_ESCAPE_SPACES_ONLY 标志将覆盖此行为,但仅适用于空格字符。
例子
以下示例显示了 URL 上各种标志的效果。 示例 URL 无效,但出于演示目的被夸大。
// The full original URL
http://microsoft.com/test/t%e<s t.asp?url=/{ex% ample</abc.asp?frame=true#fr%agment
// URL_ESCAPE_SPACES_ONLY
// Only space characters are escaped. Other unsafe characters are ignored.
// Note: This flag expects the server portion of the URL to be omitted.
Original = test/t%e<s t.asp?url=/{ex% ample</abc.asp?frame=true#fr%agment
Result = test/t%e<s%20t.asp?url=/{ex%%20ample</abc.asp?frame=true#fr%agment
// URL_ESCAPE_SPACES_ONLY | URL_DONT_ESCAPE_EXTRA_INFO
// Spaces in the segment are converted into their escape sequences, but
// spaces in the query are not.
Original = test/t%e<s t.asp?url=/{ex% ample</abc.asp?frame=true#fr%agment
Result = test/t%e<s%20t.asp?url=/{ex% ample</abc.asp?frame=true#fr%agment
// URL_ESCAPE_PERCENT
// Here only the segment and query are supplied and the server component is
// omitted, although that is not required. Only the segment is considered.
// All unsafe characters plus the % character are converted in the segment.
Original = test/t%e<s t.asp?url=/{ex% ample</abc.asp?frame=true#fr%agment
Result = test/t%25e%3Cs%20t.asp?url=/{ex% ample</abc.asp?frame=true#fr%agment
// URL_ESCAPE_SEGMENT_ONLY
// Note: This flag expects only the segment, omitting the server and query
// components.
// The / character is escaped as well as the usual unsafe characters.
Original = test/t%e<s t.asp
Result = test%2Ft%e%3Cs%20t.asp
注意
shlwapi.h 标头将 UrlEscape 定义为一个别名,该别名根据 UNICODE 预处理器常量的定义自动选择此函数的 ANSI 或 Unicode 版本。 将中性编码别名与不中性编码的代码混合使用可能会导致编译或运行时错误不匹配。 有关详细信息,请参阅函数原型的
要求
要求 | 价值 |
---|---|
最低支持的客户端 | Windows 2000 Professional、Windows XP [仅限桌面应用] |
支持的最低服务器 | Windows 2000 Server [仅限桌面应用] |
目标平台 | 窗户 |
标头 | shlwapi.h |
库 | Shlwapi.lib |
DLL | Shlwapi.dll (版本 5.0 或更高版本) |