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

2023-12-06

我的 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 安装上运行时的阿拉伯字符。

一个巧妙的脚本,可以直接访问 Win32GetEnvironmentVariableWAPI 可以调用它来检索本机 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(使用前将#替换为@)

在 ColdFusion 中使用 cgi.PATH_INFO 在 URL 中使用 unicode 时出现问题 的相关文章

随机推荐

  • 使用 C# Process 运行可执行程序

    我是一名生物信息学人员 我的工作使用 C 我已经多次使用 C 中的进程来运行可执行程序 这次我有一个新问题 我在 Windows 中下载了一个名为 Blast 的程序的 exe 文件 如果我输入我的命令 blastp query input
  • python 中 GSDMM 的实际示例?

    我想使用 GSDMM 将主题分配给我的数据集中的一些推文 我发现的唯一例子 1 and 2 不够详细 我想知道您是否知道一个显示 GSDMM 是如何使用 python 实现的来源 或者足够关心做一个小例子 我最终编译了 GSDMM 的代码
  • 无法升级Android SDK

    我已经关闭了所有窗口 重新启动了计算机 但 Eclipse 告诉我 C Program Files android sdk tools 正在被访问 我什至删除了该目录 但我仍然得到 如何修复 无法重命名目录 C Program 文件 And
  • 使用 ToString() 格式化时小数和双精度之间的舍入差异

    使用格式化数值时我发现结果存在差异ToString F2 0 125m ToString F2 CultureInfo InvariantCulture 0 13 0 125 ToString F2 CultureInfo Invarian
  • 将所有并排单词成对分割字符串单词[关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我需要将字符串分割成单词 然后将每个连续的单词成对连接 如下所示 This is my
  • 检查文件/文件夹访问权限

    我得到一个UnautorizedAccessException运行这段代码 string fileList Directory GetFiles strDir strExt 异常发生在c users username appdata如何检查
  • Worklight 构建错误无法初始化 ClientProjectBuilder

    我突然开始收到如下所示的工作灯构建错误 我不知道为什么它突然开始发生 该代码工作正常 直到我用于 Xcode 构建的远程计算机重新启动 有什么线索可能导致它吗 ipad 构建失败 初始化 ClientProjectBuilder 失败 an
  • Amazon sns(推送通知)不发送到 IOS 应用程序

    最近app收不到通知 android端正常 ios端却失败 所以这就是我的尝试 1 generate token from apple apn service 2 create the endpoint at amazon backend
  • 代码行分析器是否需要解析树,这是否足够?

    我正在尝试确定为某种语言 例如可用于 Python 和 Matlab 的语言 编写线路分析器所需的条件 解释 行分析器 的一种天真的方法是假设可以在每一行周围插入时间记录 但行的定义取决于解析器如何处理空格 这只是第一个问题 似乎需要使用解
  • 跳出包含 switch 语句的 while 循环

    我无法弄清楚如何跳出包含 switch 语句的循环 Break 从开关中中断 而不是从循环中中断 可能有一个更优雅的解决方案 我已经实现了一个标志 该标志一开始为 true 然后设置为 false 然后结束循环 您能提供更好的解决方案吗 背
  • Dash Plotly 日期时间选择

    Dash 世界中是否有任何东西可以提供一个很好的界面来输入日期时间 时间增量 无论什么类型 np pd dt 等 我目前只能找到真正支持日期的代码https dash plotly com dash core components date
  • 如何循环遍历动态表单输入并将其插入数组

    我有一个表单 要求用户在多个表单字段中输入数字 他们可以选择他们想要的表单字段数量 我已将表单字段标记为 df1 df2 df3 等 对于用户添加的每个额外表单字段 只需在 df 后面的数字上加 1 我的问题是尝试捕获 使用 PHP 这些字
  • 如何使用模拟匿名类型的设置?

    我有以下存储库 interface IReportingRepository where T Report IEnumerable
  • Heroku + node.js 错误(Web 进程未能在启动后 60 秒内绑定到 $PORT)

    我有我的第一个node js应用程序 在本地运行良好 但我无法通过heroku部署它 也是第一次使用heroku 代码如下 SO 不允许我编写这么多代码 所以我只想说在本地运行代码以及在我的网络中都没有问题 var http require
  • 如何使用 Jasmine 测试 AngularJS 控制器的 Promise 返回值?

    我有一个控制器 它公开一个函数 该函数在休息调用后返回一些文本 它工作得很好 但我在用 Jasmine 测试它时遇到了麻烦 测试中 Promise 处理程序内的代码永远不会执行 控制器 global Q use strict angular
  • 避免打印到控制台的字符串被截断(在 RStudio 中)

    我想将一个长字符串打印到 RStudio 控制台 这样它就不会被截断 gt paste 1 300 letters collapse 1 1 a 2 b 3 c 4 d 5 e 6 f 7 g 8 h 9 i 181 y 182 z 183
  • 如何在硒的新选项卡中滚动

    我通过单击 c 中的 selenium 中的某些内容打开了一个新选项卡 我想在更改到新选项卡后滚动 但出现超时错误 我收到超时消息并且没有滚动 这是 C 代码 二手 Chrome 79 Chrome 选项是 options AddArgum
  • 将因子转换为指示变量? [复制]

    这个问题在这里已经有答案了 如何将 R 中的一个因子转换为多个指标变量 每个级别一个 一种方法是使用model matrix model matrix Species iris Intercept Speciesversicolor Spe
  • 在 C# Winform 上使用显示对话框时出现非常奇怪的错误

    我在 VS Studio 2008 Express Edition 中创建了 2 个表单 并在主 program cs 文件中使用 public static 声明它们 我只想使用 ShowDialog 和 Close 在两个表单之间切换
  • 在 ColdFusion 中使用 cgi.PATH_INFO 在 URL 中使用 unicode 时出现问题

    我的 ColdFusion IIS 6 上的 MX7 站点具有搜索功能 可将搜索词附加到 URL 例如http www example com search cfm searchterm 我遇到的问题是这是一个多语言网站 因此搜索词可能是另