4

我的 ColdFusion(IIS 6 上的 MX7)站点具有搜索功能,可将搜索词附加到 URL,例如http://www.example.com/search.cfm/searchterm.

我遇到的问题是这是一个多语言网站,因此搜索词可能是另一种语言,例如القاهرة导致搜索 URL,例如http://www.example.com/search.cfm/القاهرة

问题是当我从 URL 中检索搜索词时。我正在使用cgi.PATH_INFO检索搜索页面的路径和搜索词并从中提取搜索词,例如/search.cfm/searchterm,但是,当在搜索中使用 unicode 字符时,它们将转换为问号,例如/search.cfm/??????.

这些似乎是实际的问号,而不是浏览器无法格式化 unicode 字符,或者它们在输出时被破坏。

我找不到有关 ColdFusion 是否在 URL 中支持 unicode 的任何信息,或者我如何解决这个问题并以某种方式获取完整的 URL - 有人有什么想法吗?

干杯,

汤姆

编辑:进一步的研究让我相信这个问题可能与 IIS 而不是 ColdFusion 有关,但我原来的查询仍然有效。

进一步编辑

结果GetPageContext().GetRequest().GetRequestUrl().ToString()http://www.example.com/search.cfm/searchterm/?????这样看来问题相当深入。

4

3 回答 3

3

是的,这不是ColdFusion的错。这是一个常见的问题。

这主要是原始 CGI 规范的错误,该规范指定PATH_INFO必须进行 % 解码,从而丢失了原始%xx字节序列,这些字节序列可以让您计算出哪些真实字符的含义。

这部分是 IIS 的错,因为它总是尝试%xx将路径部分中的提交字节读取为 UTF-8 编码的 Unicode(除非路径不是有效的 UTF-8 字节序列,在这种情况下它会为 Windows 默认代码页填充,但无法让您发现这种情况已经发生)。完成后,它将它作为 Unicode 字符串放入环境变量中(因为 envvars 在 Windows 下是 Unicode)。

然而,大多数使用 C stdio 的基于字节的工具(我假设这适用于 ColdFusion,就像在 Perl、Python 2、PHP 等下一样)然后尝试将环境变量读取为字节,并且 MS C 运行时编码Unicode 内容再次使用 Windows 默认代码页。因此,任何不适合默认代码页的字符都将永远丢失。在西方 Windows 安装上运行时,这将包括您的阿拉伯字符。

一个可以直接访问 Win32 GetEnvironmentVariableWAPI 的聪明脚本可以调用它来检索本地 Unicode 环境变量,然后他们可以将其编码为 UTF-8 或他们想要的任何其他内容,假设输入也是 UTF-8(这就是你今天通常想要)。但是,我不认为 CodeFusion 可以为您提供这种访问权限,而且无论如何它只能从 IIS6 开始工作;IIS5.x 将在它们到达环境变量之前丢弃任何非默认代码页字符。

否则,最好的选择是 URL 重写。如果 CF 上方的层可以将其转换search.cfm/القاهرة为,search.cfm/?q=القاهرة那么您就不会遇到同样的问题,因为QUERY_STRING与 不同,变量PATH_INFO未指定为 %-decoded,因此%xx字节保留在 CF 级别的工具可以看到它们的位置。

于 2010-05-04T22:15:58.623 回答
2

这是你可以做的:

<cfset url.searchTerm = URLEncodedFormat("القاهر", "utf-8") >

<cfset myVar = URLDecode(url.searchTerm , "utf-8") >

当然,我建议你在这种情况下使用这样的东西:

yourtemplate.cfm?searchTerm=%C3%98%C2%A7%C3%99%E2%80%9E

然后你在 IIS 中进行 URL 重写(如果框架/应用程序的其余部分尚未完成)http://learn.iis.net/page.aspx/461/creating-rewrite-rules-for-the-url-rewrite -module/以匹配您的模式。

于 2010-05-04T14:44:29.523 回答
0

您可以使用 setEncoding() 函数设置 URL 和 FORM 范围的字符编码:

http://www.adobe.com/livedocs/coldfusion/7/htmldocs/wwhelp/wwhimpl/common/html/wwhelp.htm?context=ColdFusion_Documentation&file=00000623.htm

您需要在访问此范围内的任何变量之前执行此操作。

但是,这些范围的默认编码已经是 UTF-8,所以这可能无济于事。此外,这可能不会影响 CGI 范围。

IIS 服务器是否将正确的字符记录到请求日志中?

于 2010-05-04T12:47:56.153 回答