什么是unicode character首(U 9996)和java / mysql如何处理它及其朋友?

我有一个
java字符串,其中包含unicode字符U 9996(如果我执行codePointAt(),那就是我得到的).

如果我在调试器表达式面板(在eclipse中)中查看它,那么一切都很好,它看起来像“首”.但是,如果我将它打印到控制台,我只需“?”.它似乎不是那个问题的字体,因为我尝试过不同的设置.

我真正的问题是我正在尝试将字符串放入MySQL数据库(使用utf8编码).很多其他广泛的角色在数据库中显示得很好,但是,这个和其他一些像它一样显示为“?”.所有这些让我相信问题出在java方面.

在追逐这个错误时,我已经学到了一些关于Unicode Normalization和java.text.Normalizer的内容,看起来它在这种情况下可能是相关的.我了解到U 9996是U 2FB8的规范版本. U 2FB8在显示方面有完全相同的问题,无论如何我为什么要转换为非规范表示(即使我可以,我认为我不能)?

无论如何,我找到了一条我无法理解的潜在线索. This page包含单词“U 9996不是有效的unicode字符”,没有进一步说明.然后它继续展示如何在各种unicode编码中编码这个所谓的无效unicode字符.所以我的问题基本上是这样的:WTF?

更新

>我在Mac上.
>我在谈论Eclipse控制台.

>我在Run>下将控制台编码设置为UTF-8;共同
>我将-Dfile.encoding = UTF-8添加到JVM参数(默认为MacRoman)
>控制台(Eclipse和Terminal.app)现在显示正确的字符.万岁!

>我最感兴趣的是数据正确进入数据库,当然我想要全面了解这里发生了什么.
>我想我已修复了数据库问题.我忘了在连接上设置编码.现在我不明白为什么一些亚洲人物正在经历而不是其他人.
> Phew,stackoverflow快速移动.很难跟上.谢谢大家.

最佳答案 您是否验证了存储在数据库中的值实际上是U 003f(问号)?有关如何显示所选字体中不存在的字符并将其显示为?’的各种约定?很常见

所以最有可能的是,角色被正确存储,无论出于何种原因,只是显示为“?”.基本上,忽略它的呈现方式,并查看在数据库中存储的代码点.它是U 9996还是U 003f(或完全不同的东西)?
不要盲目地认为只是因为它被渲染为问号,它实际上是一个存储在数据库中的问号.

点赞