避免在Java中打印unicode替换字符

时间:2009-12-02 11:20:36

标签: java unicode character replace

在Java中,为什么Character.toString((char) 65533)会打印出这个符号: ?

我有一个Java程序,可以在任何地方打印这些字符。这是一个很大的计划。关于我可以采取哪些措施来避免这种情况?

5 个答案:

答案 0 :(得分:10)

最可能的情况之一是您尝试使用UTF-8字符集读取ISO-8859数据。如果您遇到一系列无效的UTF-8字符,那么它将被替换为 符号。

检查输入流,并确保使用正确的字符集读取它们。

答案 1 :(得分:8)

  

在java中,为什么Character.toString((char)65533)会打印出这个符号: ?

因为确切的特定字符 IS 与特定的codepoint相关联。它似乎显示随机字符。

  

我有一个java程序,可以在任何地方打印这些字符。这是一个很大的计划。关于我可以采取哪些措施来避免这种情况?

你的问题出在其他地方。至少可以归结为你应该设置每一步,其中涉及byte - char次转换(在文件/ db中存储文本,从文件/ db中读取文本,操作文本,传输文本,显示文本等等,以使用UTF-8

引起我注意的是,Java对0xFFFD绝对没有什么特别之处,它只是用问号?取代了未覆盖的字符,而且你坚持认为0xFFFD来了来自Java。我知道Firefox完全按照你说的去做,所以你可能会把“Firefox”与“Java”混淆吗?

如果这是真的并且您实际上在谈论Java Web应用程序,那么您需要至少将HTTP响应编码设置为UTF-8。您可以通过将<%@ page pageEncoding="UTF-8" %>置于相关JSP页面的顶部来实现。您可能会发现this article对于获取更多背景信息以及解决此“Unicode问题”所需的所有步骤和解决方案的详细概述非常有用。

答案 2 :(得分:2)

没有Unicode字符U + FFFD。因此,代码在逻辑上是不正确的。 Unicode替换符号的预期用途将被替换为错误输入(例如(char)65533)。

如何修复它:不要将垃圾放入字符串中。字符串用于文本。字节用于随机二进制数据。

答案 3 :(得分:1)

那么,你想要它做什么?如果您将这些字符“遍布整个地方”,我怀疑您的数据不好......您收到无法用Unicode表示的数据应该非常罕见。

您如何获取数据?

答案 4 :(得分:1)