import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;public class test{
public static void writeLog(String fileName, String content) {
try {
RandomAccessFile raf = new RandomAccessFile(fileName, "rw");
raf.seek(raf.length());
raf.write(content.getBytes("UTF-8"));
raf.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}public static void main(String[] args) {
test tt = new test();
tt.writeLog("D:/worksoft/Java/jdk1.5.0_18/bin/www.xml","我wo");
我的程序如上。
按理说出来的文档中,“我”占2个字节,“wo”各占一个字节,可是字母却占4个字节。
这是为何?
我的jdk版本是jdk1.5.0_18。
各位大侠帮忙吧。
import java.io.IOException;
import java.io.RandomAccessFile;public class test{
public static void writeLog(String fileName, String content) {
try {
RandomAccessFile raf = new RandomAccessFile(fileName, "rw");
raf.seek(raf.length());
raf.write(content.getBytes("UTF-8"));
raf.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}public static void main(String[] args) {
test tt = new test();
tt.writeLog("D:/worksoft/Java/jdk1.5.0_18/bin/www.xml","我wo");
我的程序如上。
按理说出来的文档中,“我”占2个字节,“wo”各占一个字节,可是字母却占4个字节。
这是为何?
我的jdk版本是jdk1.5.0_18。
各位大侠帮忙吧。
java里面是unicode,所以都是2个字节
楼主理解错误
在UTF-8中,“我”占3个字节,就是:e6 88 91
“wo”各占一个字节,分别是:77 6f [也就是ASCII码值]
可是字母占2个字节是正常的了?为什么同样的77 6f ,UTF-8中占2个字节,ANSI中占1个字节?
大侠,
那如何修改成utf-8呢?
我用UltraEdit 15 版本,生成了一个无BOM头的UTF-8的文件。一检查发现就是占用2个字节的。请高人确定!~
'我': 三字节
'w': 一字节
'o': 一字节一起五个字节PS:
UTF-8中,字母是一个字节,符号拉丁字母二个字节,汉字还有其他的日语韩语之类的三个字节。
楼主误解了:标准ASCII字符(0-127)如:'w','o'无论在UTF-8中,还是ASCII中,都是一个字节。
1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。
2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。
下表总结了编码规则,字母x表示可用编码的位。
Unicode符号范围 | UTF-8编码方式
UTF字节数 (十六进制) | (二进制)
--------------------+---------------------------------------------
一个字节 0000 0000-0000 007F | 0xxxxxxx
两个字节 0000 0080-0000 07FF | 110xxxxx 10xxxxxx
三个字节 0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
四个字节 0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
下面, 还是以汉字“严”为例,演示如何实现UTF-8编码
已知“严”的unicode是4E25(100111000100101),根据上表,可以发现4E25处在第三行的范围内(0000 0800-0000 FFFF),因此“严”的UTF-8编码需要三个字节,即格式是“1110xxxx 10xxxxxx 10xxxxxx”。然后,从“严”的最后一个二进制位开始,依次从后向前填入格式中的x,多出的位补0。这样就得到了,“严”的UTF-8编码是“11100100 10111000 10100101”,转换成十六进制就是E4B8A5。
\u0001和\u007f之间的字符,UTF-8编码为:(byte)c.
\u0000或其在范围\u0080和\u07ff,UTF-8编码为:
(byte)(0xc0|(0x1f&(c>>6))),(byte)(0x80|(0x3f&c))
\u0800和\uffff之间的字符,UTF-8编码为:(byte)(0xe0|(0x0f&(c>>12))),byte)(0x80|(0x3f&(c>>6))),byte)(0x80|(0x3f&c))
那就“wo”来说,
在ANSI格式下,用UltraEdit打开,选中一个字母(也就是使一个字母高亮),UE工具的右下角会显示占用字节数,上面显示的是1.
而在UTF-8下,同样的工具打开,选中一个字母,UE则会显示占用2个字节。
我只是不懂这是啥意思了。而且,这种格式似乎导致了IBM一个中间件处理上出现问题。嗨~郁闷呀。