在Java中打印Unicode字符时为什么会输出'?'?

3
当在Java中打印某些Unicode字符时,输出结果可能会变成“?”。这是为什么,有没有办法打印这些字符?
以下是我的代码:
String symbol1="\u200d";
        StringBuilder strg = new StringBuilder("unicodecharacter");
        strg.insert(5,symbol1);
        System.out.println("After insertion...");
        System.out.println(strg.toString());

插入后的输出是... unicode字符


1
哪些特定字符,以及如何打印?请分享一些代码。这可能是编码问题、字符数据处理问题或字体问题。如果没有关于情况的真实信息,那就只能说这么多了。 - Jukka K. Korpela
你正在使用非Unicode编码进行打印(因为Unicode已经包含了所有内容)。如果编码是ISO-8859-1(Latin-1),你可以尝试使用Windows-1252(Windows Latin-1,稍微多一些)进行打印。new OutputStreamWriter(outputStream, "Windows-1252") - Joop Eggen
你要打印哪些字符以及它们在哪里?如果你想在Windows控制台中输出任意Unicode字符,那么现在就放弃吧,因为这是无法解决的问题。 - bobince
5个回答

3

这篇由Joel Spolsky撰写的文章,是关于Unicode的话题。它可能无法直接帮助您解决问题,但可以帮助您了解正在发生的事情。它还将向您展示情况的复杂程度。


谢谢这篇文章,它提高了我的理解。 - user2821099

2

您的字符编码与屏幕上的支持字符或您所拥有的字符不匹配。

我建议您检查使用的编码方式,并确定是否正确地读取、存储或打印该值。


0

我编写了一个开源库,其中包含一个实用程序,可以将任何字符串转换为Unicode序列,反之亦然。它有助于诊断此类问题。因此,例如,要打印您的字符串,您可以使用以下内容:

String str= StringUnicodeEncoderDecoder.decodeUnicodeSequenceToString("\\u0197" +
   StringUnicodeEncoderDecoder.encodeStringToUnicodeSequence("Test"));

您可以在具有堆栈跟踪过滤器、静默字符串解析Unicode转换器和版本比较的开源Java库中了解该库的相关信息,包括下载和使用方法。请参阅段落“字符串Unicode转换器”。


0
你确定需要哪种编码吗?如果你处理的是欧洲字符,你可能需要明确地将输出编码为UTF-8或ISO 8859-1。

0

Java在读取无效的Unicode字符时的默认行为是用替换字符(\uFFFD)来代替它。这个字符通常被渲染成一个问号。

在您的情况下,您正在阅读的文本不是以Unicode编码的,而是以其他编码方式编码的(如果您的文本是英语,则Windows-1252或ISO-8859-1可能是最常见的替代方案)。


非常感谢。我更改了编码,现在代码运行良好。 - user2821099

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