使用 getPageContext().getRequest().getParameterValues() 时如何防止 unicode 字符损坏?

How to prevent unicode character corruption when using getPageContext().getRequest().getParameterValues()?

我们有一个场景,一个页面提交了多个同名的字段。为了绕过 CF 的默认方法将它们放入逗号分隔的字符串中,而不更改应用程序范围,我们使用 getPageContext().getRequest().getParameterValues("#fieldname#").

访问某些地方的字段值作为数组

我们遇到的问题是提交的 unicode 字符已损坏。例如,字段数组中的 El celular que compré está averiado 作为字符串 El celular que compré está averiado 返回。如果我转储 getHTTPRequestData() 我可以看到正确的 url 编码 El+celular+que+compr%C3%A9+est%C3%A1+averiado 被发送到服务器。

CF 是否正确处理了 java 字符串?无论如何要在非应用程序范围内解决这个问题,而不是解析我们真的不想做的 getHTTPRequestData().content

原因是您的网络服务器没有在内部使用 utf-8 对其参数进行编码。当通过 url 范围访问变量时,您通常看不到这一点,因为 CF 已经为您转换了它们,但是在查看 cgi.query_string 或 [=13= 时,您可以看到这种差异]

在您的情况下,您似乎看到了 windows-1252 编码。我在 IIS7.5 - IIS8 周围遇到了类似的问题。假设您不能或不想冒险尝试更改您的网络服务器配置,此解决方法应该适合您:

webserverEncodedString = getPageContext().getRequest().getParameterValues(fieldname);
binaryValue = CharsetDecode(webserverEncodedString, "windows-1252");
utf8EncodedString = CharsetEncode(binaryValue, "utf-8");