【问题标题】:Java EE Web Project and Character EncodingJava EE Web 项目和字符编码
【发布时间】:2011-06-16 17:28:57
【问题描述】:

我们构建了一个 java ee web 项目并使用 jdbc 来存储我们的数据。 问题是像äöü这样的德语“元音变音”正在使用中并正确存储在mysql数据库中。我们不知道为什么,但是在浏览器中这些字符被破坏了,显示出奇怪的东西,比如

ö�

相反。 我已经尝试过设置 jdbc 连接的编码,就像这个问题中描述的那样:

JDBC character encoding

并且html页面的编码设置正确:

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />

有什么办法解决这个问题吗?


更新

connection.prepareStatement("SET CHARACTER SET utf8").execute();

不会使变音符号起作用。 将元标记更改为

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

也不会改变任何事情

【问题讨论】:

    标签: encoding jdbc jakarta-ee glassfish diacritics


    【解决方案1】:

    “我们不知道为什么,但是在浏览器中这些字符被破坏了”

    嗯,这是要找出的第一件事。您应该在每个阶段跟踪您的数据:

    • 当您从数据库中提取它时(使用日志记录)
    • 当您将其注入页面时(带有日志记录)
    • 在线上(通过Wireshark

    当您记录时,不要只记录字符串:将构成字符串的 Unicode 字符记录为整数。只需将字符串中的每个字符转换为整数并记录即可。它很原始,但它会告诉你你需要知道什么。

    当然,当您查看网络时,您会看到 bytes 而不是字符本身。您应该计算出您期望的所选编码的字节数,并将这些字节与实际通过网络传输的字节进行检查。

    您已经在 HTML 中指定了编码 - 但您是否告诉生成您的页面的任何内容您希望它使用 ISO Latin 1?这可能负责设置内容类型标头执行从文本到字节的实际转换。

    此外,您是否有任何理由使用 ISO Latin 1 而不是 UTF-8?为什么要刻意那样限制自己? (ISO Latin 1 只能处理 Unicode 的前 256 个字符,而不是所有的 Unicode 字符。UTF-8 可以处理所有内容,对 ASCII 也同样有效。)

    【讨论】:

    • 好吧,那我试试记录。我正在使用标准 servlet 和一些标签。
    • 这样解决了,这些字符在从数据库中检索后直接被破坏。
    • @phineas:好的,下一步是编写一个 console 应用程序,该应用程序尝试从数据库中获取数据并以相同的方式记录它。这样一来,您就无需为正确设置 webapp 部分而烦恼 - 修改控制台应用程序 IMO 会容易得多。
    • 我做了一些记录,例如,德语“ö”被分成两个字符,“Ô(int 195)和“¶”(int:182)。
    • @phineas:你是怎么“我做了一些日志记录”的?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多