1

我需要将 application/x-www-form-urlencoded 数据提交到 Web 服务器。服务器期望使用 ISO-8859-1 对数据进行编码。

不幸的是URLEncoder.encode(string, "ISO-8859-1"); 并不总是有效。

任何不属于 ISO-8859-1 的字符都被编码为 %3F(即 '?')。

Firefox 以在服务器端工作的其他方式处理这些字符。

\uFEFF(零宽度不间断空格)被编码为%26%2365279%3B这正是我所需要的。

谁能告诉我如何模仿这种行为/FF做什么?

4

1 回答 1

1

回答我自己的问题:

FF 将不可映射的字符转换为十进制 HTML 实体,并使用字符集对这些实体进行编码。

\uFEFF -> & #65279; (忽略中间的空格)-> %26%2365279%3B

( %26 = & | %23 = # | %3B = ; )

这是一个在 Java 中执行第一步的方法:

public static String htmlEscapeUnmappableCharaters(String source, String charset) {
    CharsetEncoder cse = Charset.forName(charset).newEncoder();

    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < source.length(); i++) {

        if (cse.canEncode(source.charAt(i))) {
            sb.append(source.charAt(i));
        } else {
            sb.append('&');
            sb.append('#');
            sb.append(source.codePointAt(i));
            sb.append(';');
        }
    }

    return sb.toString();
}
于 2013-02-17T00:36:14.840 回答