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)即可得到你要的字符,这个是从键盘输入一行,其它你可以自己改。
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)即可得到你要的字符,这个是从键盘输入一行,其它你可以自己改。
代码:
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字节。
但是结果表明英文字符是占一个字节,而中文占两个,怎么解释?
望达人帮忙!
“字节串”“字符串”“编码”
这些等概念。http://www29.websamba.com/sswater/docs/coding.zipzip 文件中是一个 ppt,里面的内容看上去很少,但是那是一边看我一边给大家讲的,每一句话都可以展开来说的。因此,你需要对每一句话都要读仔细,你将能够对“字节”“字符”“编码”从此不再迷惑。
UTF-8才是所有字符为2字节。
现在有一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个字节(大部分汉字在这个范围)
0-127 占一个字节
128-2047 占2个字节
2048-65535 占3个字节(大部分汉字在这个范围)
自己觉得明白的 且 有不同意见的,请不要在此污染环境。
看完后我还是有个问题,希望能帮忙回答一下。
pps中提到GBK中,原来的Asicc码中的字符在GBK中还是占一个字节,这点确定吗?
如果确定的话那么在Uincode中应该占几个字节呢?
照里面的算法来说应该占两个,我也认为占两个。那么GBK还是不是Unicode的子集呢?
每个汉字及符号以两个字节来表示。第一个字节称为“高位字节”,第二个字节称为“低位字节”。
“高位字节”使用了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 个字节。
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
我把String substr1= new String( buffer, 0, pos );换成String substr1 = new String( buffer ,"UnicodeBig");后就出错:
未处理的异常类型 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") );
}
}
{
System.out.println( new String(buffer, "UnicodeBig") );
}
catch(UnsupportedEncodingException e) {
}
真的学到了不少东西。
建议楼主将绝大多数分都给他,我不要了。