我的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/?????
所以看起来问题相当深。
答案 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范围的字符编码:
在访问此范围内的任何变量之前,您需要执行此操作。
但是,这些范围的默认编码已经是UTF-8,所以这可能没有帮助。此外,这可能不会影响CGI范围。
IIS服务器是否将正确的字符记录到请求日志中?