我有一个包含Unicode字符U+9996的Java字符串(如果我使用codePointAt(),就会得到这个结果)。
如果我在调试器表达式面板(在eclipse中)查看它,一切都很好,它看起来像“首”。但是,如果我将其打印到控制台上,我只能得到“?”。似乎不是字体的问题,因为我已经尝试过不同的设置。
我的真正问题是,我正在尝试将该字符串放入MySQL数据库(使用utf8编码)。许多其他宽字符在数据库中显示正常,但是这一个和其他类似的字符都显示为“?”。所有这些都让我相信问题出在Java方面。
在追踪这个错误时,我学到了一些关于Unicode规范化和java.text.规范化器的知识,看起来在这种情况下可能与此相关。我了解到U+9996是U+2FB8的规范版本。然而,U+2FB8与上述显示问题完全相同,无论如何我为什么要转换为非规范表示(即使我可以,我认为我做不到)?
无论如何,我发现了一个潜在的线索,但我无法理解。此页面包含“U+9996不是有效的Unicode字符”这些话,没有进一步的解释。然后它继续展示了如何在各种Unicode编码中对这个所谓的非有效Unicode字符进行编码。所以我的问题基本上是:WTF?
如果我在调试器表达式面板(在eclipse中)查看它,一切都很好,它看起来像“首”。但是,如果我将其打印到控制台上,我只能得到“?”。似乎不是字体的问题,因为我已经尝试过不同的设置。
我的真正问题是,我正在尝试将该字符串放入MySQL数据库(使用utf8编码)。许多其他宽字符在数据库中显示正常,但是这一个和其他类似的字符都显示为“?”。所有这些都让我相信问题出在Java方面。
在追踪这个错误时,我学到了一些关于Unicode规范化和java.text.规范化器的知识,看起来在这种情况下可能与此相关。我了解到U+9996是U+2FB8的规范版本。然而,U+2FB8与上述显示问题完全相同,无论如何我为什么要转换为非规范表示(即使我可以,我认为我做不到)?
无论如何,我发现了一个潜在的线索,但我无法理解。此页面包含“U+9996不是有效的Unicode字符”这些话,没有进一步的解释。然后它继续展示了如何在各种Unicode编码中对这个所谓的非有效Unicode字符进行编码。所以我的问题基本上是:WTF?
更新
- 我使用的是Mac电脑。
- 我在谈论Eclipse控制台。
- 我在Run > Common下将控制台编码设置为UTF-8。
- 我在JVM参数中添加了
-Dfile.encoding=UTF-8
(默认为MacRoman)。 - 现在,控制台(Eclipse和Terminal.app)显示正确的字符。太好了!
- 尽管当然我想要完全理解这里发生了什么,但我主要关心数据能否正确地进入数据库。
- 我认为我已经解决了数据库问题。我忘记在连接上设置编码。现在,我不明白为什么有些亚洲字符可以通过而其他字符却不能。
- 哇,stackoverflow真的很快。很难跟上。感谢大家。