(50分求求)char型UNICODE码怎么变成汉字?

nongge 2005-10-17 09:58:15
JAVA: char型UNICODE码怎么变成汉字并输出?
怎么输入char型数据?
...全文
666 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
nongge 2005-10-19
  • 打赏
  • 举报
回复
刚才运行时出了点问题,现在运行后是乱码!
我把String substr1= new String( buffer, 0, pos );换成String substr1 = new String( buffer ,"UnicodeBig");后就出错:
未处理的异常类型 UnsupportedEncodingException
nongge 2005-10-19
  • 打赏
  • 举报
回复
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.html

Activation.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
yorkchen 2005-10-19
  • 打赏
  • 举报
回复
GZ
nongge 2005-10-19
  • 打赏
  • 举报
回复
感谢我的父母,感谢我的祖国,感谢sswater(水与争锋),感谢conquer2004(.) ,感谢我身边每一个互相帮助的人!
  • 打赏
  • 举报
回复
好贴!
紫炎圣骑 2005-10-19
  • 打赏
  • 举报
回复
同意楼上,受益匪浅
低调的小青蛙 2005-10-19
  • 打赏
  • 举报
回复
如果搂主现在拥有的是 String str = "4F60597D" 这样的字符串,那么你需要想办法转化成为 byte ng[] = new byte[] { 0x4F, 0x60, 0x59, 0x7D } 这样的字节串。你可以使用 substring(0, 2) 方法将字符串取出其中一个子串,然后用 Byte.parseByte(substr, 16) 来得到一个个的 byte。

最后再用我说的 new String( ng, "UnicodeBig" ) 来得到你要的结果。
conquer2004 2005-10-19
  • 打赏
  • 举报
回复
非常感谢 sswater(水与争锋)!
真的学到了不少东西。
建议楼主将绝大多数分都给他,我不要了。
低调的小青蛙 2005-10-19
  • 打赏
  • 举报
回复
“原来的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 个字节。
低调的小青蛙 2005-10-19
  • 打赏
  • 举报
回复
注意声明 class CharAndByte 的大小写要与 CharAndByte.java 文件名大小写一致!
低调的小青蛙 2005-10-19
  • 打赏
  • 举报
回复
你需要声明一下:throws UnsupportedEncodingException

或者

try
{
System.out.println( new String(buffer, "UnicodeBig") );
}
catch(UnsupportedEncodingException e) {
}
低调的小青蛙 2005-10-19
  • 打赏
  • 举报
回复
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") );
}
}
superslash 2005-10-18
  • 打赏
  • 举报
回复
kankan
jordan1 2005-10-18
  • 打赏
  • 举报
回复
最近也在烦这个问题
gogon 2005-10-18
  • 打赏
  • 举报
回复
Unicode并不是所有字符为2字节,Unicode中0-9,a-z,A-Z为单字节。
UTF-8才是所有字符为2字节。
低调的小青蛙 2005-10-18
  • 打赏
  • 举报
回复
System.in.read() 得到的字节流是按照当前系统编码的字节串,并非 unicode 码。

你只需要将字节串起来之后,用 new String(buffer, 0, length) 就可以了。

更多,更详细的内容:

本人以前给公司同事培训的时候,写过一些非常易懂的说明,也许能够帮你澄清:
“字节串”“字符串”“编码”
这些等概念。

http://www29.websamba.com/sswater/docs/coding.zip

zip 文件中是一个 ppt,里面的内容看上去很少,但是那是一边看我一边给大家讲的,每一句话都可以展开来说的。

因此,你需要对每一句话都要读仔细,你将能够对“字节”“字符”“编码”从此不再迷惑。
conquer2004 2005-10-18
  • 打赏
  • 举报
回复
sswater(水与争锋) ( )给的pps的确不错。
看完后我还是有个问题,希望能帮忙回答一下。
pps中提到GBK中,原来的Asicc码中的字符在GBK中还是占一个字节,这点确定吗?
如果确定的话那么在Uincode中应该占几个字节呢?
照里面的算法来说应该占两个,我也认为占两个。那么GBK还是不是Unicode的子集呢?
BelleChang 2005-10-18
  • 打赏
  • 举报
回复
楼上的文档,真是不错
谢谢!
低调的小青蛙 2005-10-18
  • 打赏
  • 举报
回复
没有看明白 且 想弄明白的可以去看看 ppt 文档:

http://www29.websamba.com/sswater/docs/coding.zip


自己觉得明白的 且 有不同意见的,请不要在此污染环境。
低调的小青蛙 2005-10-18
  • 打赏
  • 举报
回复
纠正

UTF-8 编码:
0-127 占一个字节
128-2047 占2个字节
2048-65535 占3个字节(大部分汉字在这个范围)
加载更多回复(6)

62,629

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧