JAVA:    char型UNICODE码怎么变成汉字并输出?
         怎么输入char型数据?

解决方案 »

  1.   

    byte [] buffer = new byte[1024];
    int ch =0;
    int pos=0;
    boolean flag=true;
    while(flag)
    {
       ch = System.in.read();
       switch(ch)
       case '\t':break;
       case '\n':
              flag = false;break;
       default:
             buffer[pos++]=(byte)ch;}
    String str= new String(buffer,0,pos);
    str.charAt(int argument)即可得到你要的字符,这个是从键盘输入一行,其它你可以自己改。
      

  2.   

    借你的帖子发个字符编码问题,请不要马上结贴:
    代码:
    class CharAndByte
    {
    public static void main(String [] args)
    {
    String str = "Chinese 中国人";
    System.out.println(str+"  :  "+str.length()+ "  字符");
    System.out.println(str+"  :  "+str.getBytes().length+ "  字节");
    }
    }
    结果:
    Chinese 中国人  :  11  字符
    Chinese 中国人  :  14  字节
    知道JVM的file.encoding属性为GBK,又java默认的字符编码为Unicode,也就是说GBK为Unicode的一个真子集。Unicode编码的任何字符应该为两个字节,英文也不例外,那么程序输出应该是22字节。
    但是结果表明英文字符是占一个字节,而中文占两个,怎么解释?
    望达人帮忙!
      

  3.   

    System.in.read() 得到的字节流是按照当前系统编码的字节串,并非 unicode 码。你只需要将字节串起来之后,用 new String(buffer, 0, length) 就可以了。更多,更详细的内容:本人以前给公司同事培训的时候,写过一些非常易懂的说明,也许能够帮你澄清:
    “字节串”“字符串”“编码”
    这些等概念。http://www29.websamba.com/sswater/docs/coding.zipzip 文件中是一个 ppt,里面的内容看上去很少,但是那是一边看我一边给大家讲的,每一句话都可以展开来说的。因此,你需要对每一句话都要读仔细,你将能够对“字节”“字符”“编码”从此不再迷惑。
      

  4.   

    Unicode并不是所有字符为2字节,Unicode中0-9,a-z,A-Z为单字节。
    UTF-8才是所有字符为2字节。
      

  5.   

    对于字节字符和编码我已经有些清楚了,先谢谢!
        现在有一byte ng[]="4F60597D";//"你好"的Unicode
    我该这样将它以汉字的形式输出呢?
      

  6.   

    没写明白,应该是:byte [] buffer = {'4','f','6','0','5','9','7','d'};
        我想输出:
                 你好
    我该怎么做?
      

  7.   

    byte ng[]="4F60597D";//"你好"的Unicode
    ———————————————————nongge (农歌) 兄:byte[] 的初始化怎么能这样呢?你看看下边的代码,希望你能够理解:byte ng[] = new byte[] { 0x4F, 0x60, 0x59, 0x7D };
    String str = new String(ng, "UnicodeBig");
    System.out.println(str);就可以得到结果“你好”如果还没有看懂,你可以再看看我写的 ppt 文件。前面“gogon”说的不正确,纠正一下,UnicodeBig, UnicodeLittle 编码所有的字符都是2字节
    UTF-8 编码:
            0-127 占一个字节
            128-4095 占2个字节
            4096-65535 占3个字节(大部分汉字在这个范围)
      

  8.   

    纠正UTF-8 编码:
            0-127 占一个字节
            128-2047 占2个字节
            2048-65535 占3个字节(大部分汉字在这个范围)
      

  9.   

    没有看明白 且 想弄明白的可以去看看 ppt 文档:http://www29.websamba.com/sswater/docs/coding.zip
    自己觉得明白的 且 有不同意见的,请不要在此污染环境。
      

  10.   

    sswater(水与争锋) ( )给的pps的确不错。
    看完后我还是有个问题,希望能帮忙回答一下。
    pps中提到GBK中,原来的Asicc码中的字符在GBK中还是占一个字节,这点确定吗?
    如果确定的话那么在Uincode中应该占几个字节呢? 
    照里面的算法来说应该占两个,我也认为占两个。那么GBK还是不是Unicode的子集呢?
      

  11.   

    “原来的Asicc码中的字符在GBK中还是占一个字节,这点确定吗?”各种本地编码,包括 GBK,BIG5,ShiftJIS 等,都会兼容 0-127 范围内的英文,因此这个范围内的 ASCII 码在这些编码中只占一个字节。采用 128-255 范围内的 2 个字节来表示自己语言的一个字符。这一点,我们可以从这边文章中了解详细信息:http://zh.wikipedia.org/wiki/GB_2312摘录其中一段:在使用GB2312的程序中,通常采用EUC储存方法,以便兼容于ASCII。
    每个汉字及符号以两个字节来表示。第一个字节称为“高位字节”,第二个字节称为“低位字节”。
    “高位字节”使用了0xA1-0xF7(把01-87区的区号加上0xA0),“低位字节”使用了0xA1-0xFE(把01-94加上0xA0)。
    例如“啊”字在大多数程序中,会以0xB0A1储存。(与区位码对比:0xB0=0xA0+16,0xA1=0xA0+1)。
    “那么GBK还是不是Unicode的子集呢?”在我的 pps 文档中,我提到了一点:字符集的概念有2层含义,(1)能够容纳的范围。(2)每个字符怎样编码成为字节。因此,从范围上讲,GBK 以及任何其他字符集比如 BIG5,ShiftJIS 都是 Unicode 的子集。但并不是说每个字符编码成为字节也是一样的。将一个“汉字”使用:UnicodeBig,UTF-8,ShiftJIS,BIG5,GBK 所得到的字节相互之间都是不一样的。一个“英文字母”使用 UnicodeBig 得到2字节,而使用后边这四种:UTF-8,ShiftJIS,BIG5,GBK 编码出来的字结都已相同的 1 字节,后边这 4 种都能兼容 ASCII 码,得到 1 个字节。
      

  12.   

    如果搂主现在拥有的是 String str = "4F60597D" 这样的字符串,那么你需要想办法转化成为 byte ng[] = new byte[] { 0x4F, 0x60, 0x59, 0x7D } 这样的字节串。你可以使用 substring(0, 2) 方法将字符串取出其中一个子串,然后用 Byte.parseByte(substr, 16) 来得到一个个的 byte。最后再用我说的 new String( ng, "UnicodeBig" ) 来得到你要的结果。
      

  13.   

    public class charAndbyte {
    public static void main(String [] args)
    {
    int pos = 2;
    String str = "4F60597D";
    byte[] buffer = new byte[ 8 ];
             String substr = str.substring(0, 2);
    buffer[ 0 ] = Byte.parseByte(substr, 16);
    substr = str.substring( 2, 2 );
    buffer[ 1 ] = Byte.parseByte(substr, 16);
    String substr1= new String( buffer, 0, pos );
    System.out.println(substr1+"  :  "+str.length()+ "  字符");
    }}
    为什么没有输出"你",而是:
    Activation.main: 警告: sun.rmi.activation.execPolicy 系统
    属性未被指定且 ExecPermissions/ExecOptionPermissions
    均未被授权。随后的激活尝试失败,原因是对
    ExecPermission/ExecOptionPermission 的权限检查失败。 有关如何
    配置 rmid 安全性的文档说明,请参阅: http://java.sun.com/j2se/1.4/docs/tooldocs/solaris/rmid.html
    http://java.sun.com/j2se/1.4/docs/tooldocs/win32/rmid.htmlActivation.main: 出现异常:Port already in use: 1098; nested exception is: 
    java.net.BindException: Address already in use: JVM_Bind
    java.rmi.server.ExportException: Port already in use: 1098; nested exception is: 
    java.net.BindException: Address already in use: JVM_Bind
    at sun.rmi.transport.tcp.TCPTransport.listen(Unknown Source)
    at sun.rmi.transport.tcp.TCPTransport.exportObject(Unknown Source)
    at sun.rmi.transport.tcp.TCPEndpoint.exportObject(Unknown Source)
    at sun.rmi.transport.LiveRef.exportObject(Unknown Source)
    at sun.rmi.server.UnicastServerRef.exportObject(Unknown Source)
    at sun.rmi.registry.RegistryImpl.setup(Unknown Source)
    at sun.rmi.registry.RegistryImpl.<init>(Unknown Source)
    at java.rmi.registry.LocateRegistry.createRegistry(Unknown Source)
    at sun.rmi.server.Activation.main(Unknown Source)
    Caused by: java.net.BindException: Address already in use: JVM_Bind
    at java.net.PlainSocketImpl.socketBind(Native Method)
    at java.net.PlainSocketImpl.bind(Unknown Source)
    at java.net.ServerSocket.bind(Unknown Source)
    at java.net.ServerSocket.<init>(Unknown Source)
    at java.net.ServerSocket.<init>(Unknown Source)
    at sun.rmi.transport.proxy.RMIDirectSocketFactory.createServerSocket(Unknown Source)
    at sun.rmi.transport.proxy.RMIMasterSocketFactory.createServerSocket(Unknown Source)
    at sun.rmi.transport.tcp.TCPEndpoint.newServerSocket(Unknown Source)
    ... 9 more
      

  14.   

    刚才运行时出了点问题,现在运行后是乱码!
    我把String substr1= new String( buffer, 0, pos );换成String substr1 = new String( buffer ,"UnicodeBig");后就出错:
          未处理的异常类型 UnsupportedEncodingException
      

  15.   

    package test;import java.io.UnsupportedEncodingException;public class CharAndByte {    public static void main(String[] args) throws UnsupportedEncodingException {
            
            String  str    = "4F60597D";
            byte [] buffer = new byte[4];
            
            buffer[0] = Byte.parseByte( str.substring(0, 2), 16);
            buffer[1] = Byte.parseByte( str.substring(2, 4), 16);
            buffer[2] = Byte.parseByte( str.substring(4, 6), 16);
            buffer[3] = Byte.parseByte( str.substring(6, 8), 16);
            
            System.out.println( new String(buffer, "UnicodeBig") );
        }
    }
      

  16.   

    你需要声明一下:throws UnsupportedEncodingException 或者try
    {
        System.out.println( new String(buffer, "UnicodeBig") );
    }
    catch(UnsupportedEncodingException e) {
    }
      

  17.   

    注意声明 class CharAndByte 的大小写要与 CharAndByte.java 文件名大小写一致!
      

  18.   

    非常感谢 sswater(水与争锋)!
    真的学到了不少东西。
    建议楼主将绝大多数分都给他,我不要了。
      

  19.   

    感谢我的父母,感谢我的祖国,感谢sswater(水与争锋),感谢conquer2004(.) ,感谢我身边每一个互相帮助的人!