在Java中打印Unicode字符

11

在Java中显示unicode字符会显示问号符号。例如,我尝试打印“अ”。它的unicode编号是U+0905,HTML表示为"अ"。下面的代码打印出问号而不是unicode字符。

char aa = '\u0905';
String myString = aa + " result" ;
System.out.println(myString); // displays "? result"

有没有一种方法可以直接从 unicode 中显示字符而不使用 unicode 数字?例如,现在文件中保存了 "अ",如何在jsp中显示该文件。


11
也许你的控制台无法显示或配置该字符? - sazzad
1
@sazzad 我已经在servlet的get方法中尝试过了。在浏览器中也显示“?”。 - Redone
你的请求返回的是UTF8吗? - Scary Wombat
如果您将您的 .java 或 .jsp 文件保存为 utf-8 格式,那么您可以在其中使用 Unicode 字符而无需进行编码。 - rustyx
你正在将Unicode存储在类型为“char”的变量中。请将其放在双引号内。 - TheGeeko61
5个回答

5
Java定义了两种类型的流,字节流和字符流。
System.out.println()无法显示Unicode字符的主要原因是System.out.println()是一个字节流,只处理16位字符中的低8位。
为了处理Unicode字符(16位Unicode字符),您需要使用基于字符的流,即PrintWriter。
PrintWriter支持print()和println()方法。因此,您可以像在System.out中使用它们一样使用这些方法。
PrintWriter printWriter = new PrintWriter(System.out,true);
char aa = '\u0905';
printWriter.println("aa = " + aa);

3

您的myString变量包含完全正确的值。问题可能是来自System.out.println(myString)的输出,它必须发送一些字节到某个输出以显示您想要看到的图形。

System.out是一个PrintStream,使用“平台默认编码”将字符转换为字节序列 - 可能您的平台不支持该字符。例如,我的Windows 7电脑在德国的默认编码是CP1252,并且在此编码中没有对应于您的字符的字节序列。

或者也许编码是正确的,但仅是创建图形字符的字体没有那个字符。

如果您将输出发送到Windows CMD.EXE窗口,则可能两个原因都适用。

但请放心,您的字符串是正确的,如果将其发送到可以处理它的目标(例如Swing JTextField),它将正确显示。


2
尝试使用UTF-8字符集 -
        Charset utf8 = Charset.forName("UTF-8");
        Charset def = Charset.defaultCharset();

        String charToPrint = "u0905";

        byte[] bytes = charToPrint.getBytes("UTF-8");
        String message = new String(bytes , def.name());

        PrintStream printStream = new PrintStream(System.out, true, utf8.name());
        printStream.println(message); // should print your character

1

1

Unicode是一种独特的编码方式,用于打印任何字符或符号。

你可以从以下网站使用Unicode --> https://unicode-table.com/en/

以下是在Java中打印符号的示例。

        package Basics;
        
        /**
         *
         * @author shelc
         */
        public class StringUnicode {
        
            public static void main(String[] args) {
        
                String var1 = "Cyntia";
                String var2 = new String(" is my daughter!");
        
                System.out.println(var1 + " \u263A" + var2);
    
                //printing heart using unicode
                System.out.println("Hello World \u2665");
        
            }
        
        }
        
    ******************************************************************
    OUTPUT-->
    
    Cyntia ☺ is my daughter!
    Hello World ♥
          

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