我有一个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?
-Dfile.encoding=UTF-8
添加到JVM参数(默认为MacRoman)答案 0 :(得分:2)
您是否确认存储在数据库中的值实际上是U + 003f(问号)?有关如何显示所选字体中不存在的字符并将其显示为?'的各种约定?很常见。
所以最有可能的是,角色被正确存储,无论出于何种原因,只会显示为“?”。基本上,忽略它的呈现方式,并查看在数据库中存储的代码点。是U + 9996还是U + 003f(还是完全不同的东西)? 不要盲目地认为只是因为它被渲染为问号,它实际上是一个存储在数据库中的问号。
答案 1 :(得分:0)
我不知道这些问题,但它是definitely a valid Unicode character(自从Unicode 1.1开始)。
答案 2 :(得分:0)
关于上面的3,这可能是重要的一个,我看过类似的问题,例如PuTTY与Linux机器人交谈,其中Linux盒子认为我使用的是UTF-8,但PuTTY会话本身设置为ISO-Latin-1(8859-1)