在ColdFusion中使用带有cgi.PATH_INFO的URL中的unicode时出现问题

时间:2010-05-04 10:23:57

标签: iis url unicode coldfusion pathinfo

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

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

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

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

我无法找到有关ColdFusion是否支持网址中的unicode的任何信息,或者我如何解决此问题并以某种方式获取完整的网址 - 是否有人有任何想法?

干杯,

汤姆

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

进一步修改

GetPageContext().GetRequest().GetRequestUrl().ToString()的结果是http://www.example.com/search.cfm/searchterm/?????所以看起来问题相当深。

3 个答案:

答案 0 :(得分: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运行时使用Windows默认代码页再次对Unicode内容进行编码。因此,任何不适合默认代码页的字符都会丢失。这将包括在西方Windows安装上运行时的阿拉伯字符。

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

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

答案 1 :(得分: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/以匹配您的模式。

答案 2 :(得分: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服务器是否将正确的字符记录到请求日志中?