我的 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 - 有人有任何想法吗?
Cheers,
Tom
Edit:进一步的研究使我相信该问题可能与 IIS 而不是 ColdFusion 有关,但我最初的查询仍然成立。
进一步编辑
的结果GetPageContext().GetRequest().GetRequestUrl().ToString()
is http://www.example.com/search.cfm/searchterm/?????
所以看来这个问题相当深入。
是的,这并不是 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 安装上运行时的阿拉伯字符。
一个巧妙的脚本,可以直接访问 Win32GetEnvironmentVariableW
API 可以调用它来检索本机 Unicode 环境变量,然后将其编码为 UTF-8 或他们想要的任何其他内容,假设输入也是 UTF-8(这就是您今天通常想要的)。但是,我认为 CodeFusion 不会为您提供此访问权限,并且无论如何它仅适用于 IIS6 及以上版本; IIS5.x 将在任何非默认代码页字符到达环境变量之前将其丢弃。
否则,最好的选择是 URL 重写。如果CF上面的一层可以转换search.cfm/القاهرة
to search.cfm/?q=القاهرة
那么你就不会遇到同样的问题QUERY_STRING
变量,不同于PATH_INFO
,未指定为 % 解码,因此%xx
字节保留在 CF 级别的工具可以看到的地方。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)