Unicode字符首(U+9996)是什么意思?Java/MySQL如何处理它及其相关字符?

4
我有一个包含Unicode字符U+9996的Java字符串(如果我使用codePointAt(),就会得到这个结果)。
如果我在调试器表达式面板(在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真的很快。很难跟上。感谢大家。

U+9996是一个完全有效的字符,它是一个汉字。请参见http://www.unicode.org/cgi-bin/GetUnihanData.pl?codepoint=9996。 - Adam Rosenfield
1
如果您使用的是Windows系统,将Unicode字符写入控制台的唯一方法是使用WriteConsoleW函数:http://msdn.microsoft.com/en-us/library/ms683458.aspx。Java的源代码(OpenJDK 6)中没有任何关于WriteConsole的引用,因此从Java向控制台写入Unicode字符是不可能的。 - C. K. Young
就像其他帖子中所说的那样,char 仍然有效,只是在控制台上始终显示为 ?。 - C. K. Young
好的,我看到你在使用Mac。那么以上评论可以留给其他读者,但如果其他人没有赶上我,我会给你写一个回复。 :-) - C. K. Young
Rowan,你解决了吗?我有一个类似的问题,但是涉及到更加平凡的符号,例如€和£等。 - AncientSwordRage
3个回答

2
你是否确认在数据库中存储的值实际上是U+003f(问号)?对于不在所选字体中的字符,有各种约定如何显示它们,“?”作为显示方式是相当常见的。因此,最有可能的情况是,字符被正确地存储,但由于某些原因,只是以“?”的形式显示出来。基本上,忽略它的呈现方式,看一下在数据库中存储的代码点是什么。它是U+9996还是U+003f(或完全不同的其他内容)?不要盲目地假设仅因其呈现为问号,就实际上将问号存储在数据库中。

我该如何验证数据库中的值是否正确?我没有看到显示代码点的SQL函数。 - Rowan
2
使用Java函数将其读取回来,并在那时进行验证。 - Darryl Braaten
“?” 不是显示问题。方框(或奇怪的空格)才是(这意味着所有内容都知道如何处理 Unicode,但没有找到包含该字符的字体)。但如果出现问号或 U+FFFD 替换字符,则您永远不会看到渲染问题,而是后端的转换问题(或格式不正确的输入)。 - Joey

0

0
  1. 这个系统运行在什么操作系统上?
  2. 使用的是哪个控制台应用程序(如xterm、cmd.exe等)?
  3. 控制台应用程序是否设置为UTF-8输出?

关于上面的第3点,这可能是最重要的一点。我曾经遇到过类似的问题,比如使用PuTTY与Linux服务器通信时,Linux服务器认为我使用的是UTF-8编码,但是PuTTY会话本身却设置为ISO-Latin-1(8859-1)。


在Eclipse中,您可以设置控制台的编码,请查看首选项。 - Yoni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接