【问题标题】:Encoding/Decoding strange issue编码/解码奇怪的问题
【发布时间】:2009-10-06 20:55:48
【问题描述】:

这行代码,解码一个编码的中文单词:

URLDecoder.decode("%E4%BB%BB%E4%BD%95%E8%BD%A6%E8%BE%86%E5%BA%94",
    "UTF-8").getBytes().length

当我在 JSP 页面(在 Jboss 上)运行它时,它会打印 5:

<%= URLDecoder.decode("%E4%BB%BB%E4%BD%95%E8%BD%A6%E8%BE%86%E5%BA%94", 
       "UTF-8").getBytes().length %>

在桌面应用程序中运行它会打印 15:

public static void main(String[] args) {
    System.out.println(URLDecoder.decode(
        "%E4%BB%BB%E4%BD%95%E8%BD%A6%E8%BE%86E5%BA%94", "UTF-8"
    ).getBytes().length);
}

为什么?而且我想让jsp也得到15,如何?

【问题讨论】:

  • 你确定吗?仔细检查是否还有其他问题。您的整个 JSP 页面是什么样的? 15中的1不是以某种方式隐藏了吗? JSP 中的 Java 代码只是普通的 Java 代码,与 servlet 中的 Java 代码完全相同(实际上,JSP 被转换为 servlet)。
  • JSP 页面不包含任何其他的 URLDecoder 导入语句,我仅用于测试。
  • 不,是 5 我没看错。

标签: java unicode encoding urlencode decoding


【解决方案1】:

似乎 JBoss 使用了不同的默认编码,它不能代表字符串中的所有字符。您可能应该使用getBytes("UTF-8")

【讨论】:

    【解决方案2】:

    我不知道为什么会有差异(这取决于您运行的特定 Java 环境),但我可以告诉您差异是什么:

    您的字符串中有 15 个字节。这些字节代表 5 个 Unicode 字符,每个字符 3 个字节。

    您可以判断,因为 3 字节 UTF-8 字符的第一个字节总是以十六进制“E”开头。

    【讨论】:

      猜你喜欢
      • 2011-08-03
      • 2021-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多