我已经参考过:utf-8
--utf-8是和unicode一一对应的,其实现很简单
--
-- 7位的unicode: 0 _ _ _ _ _ _ _
--11位的unicode: 1 1 0 _ _ _ _ _ 1 0 _ _ _ _ _ _
--16位的unicode: 1 1 1 0 _ _ _ _ 1 0 _ _ _ _ _ _ 1 0 _ _ _ _ _ _
--21位的unicode: 1 1 1 1 0 _ _ _ 1 0 _ _ _ _ _ _ 1 0 _ _ _ _ _ _ 1 0 _ _ _ _ _ _
--大多数情况是只使用到16位以下的unicode:
--"你"的gb码是:0xc4e3 ,unicode是0x4f60
--我们还是用上面的例子
-- --例1:0xc4e3的二进制:
-- -- 1 1 0 0 0 1 0 0 1 1 1 0 0 0 1 1
-- -- 由于只有两位我们按照两位的编码来排,但是我们发现这行不通,
-- -- 因为第7位不是0因此,返回"?"
-- --
-- --例2:0x4f60的二进制:
-- -- 0 1 0 0 1 1 1 1 0 1 1 0 0 0 0 0
-- -- 我们用utf-8补齐,变成:
-- -- 11100100 10111101 10100000
-- -- e4--bd-- a0
-- -- 于是返回0xe4,0xbd,0xa0
-- --
3.string和byte[]
--string其实核心是char[],然而要把byte转化成string,必须经过编码。
--string.length()其实就是char数组的长度,如果使用不同的编码,很可
--能会错分,造成散字和乱码。
--例:
----byte [] b={(byte)'\u00c4',(byte)'\u00e3'};
----string str=new string(b,encoding); ----
----如果encoding=8859_1,会有两个字,但是encoding=gb2312只有一个字 ----
--这个问题在处理分页是经常发生
但是我不知道应该怎么处理
谁有高见,请指点指点,分不够可以再加!!!!!
--utf-8是和unicode一一对应的,其实现很简单
--
-- 7位的unicode: 0 _ _ _ _ _ _ _
--11位的unicode: 1 1 0 _ _ _ _ _ 1 0 _ _ _ _ _ _
--16位的unicode: 1 1 1 0 _ _ _ _ 1 0 _ _ _ _ _ _ 1 0 _ _ _ _ _ _
--21位的unicode: 1 1 1 1 0 _ _ _ 1 0 _ _ _ _ _ _ 1 0 _ _ _ _ _ _ 1 0 _ _ _ _ _ _
--大多数情况是只使用到16位以下的unicode:
--"你"的gb码是:0xc4e3 ,unicode是0x4f60
--我们还是用上面的例子
-- --例1:0xc4e3的二进制:
-- -- 1 1 0 0 0 1 0 0 1 1 1 0 0 0 1 1
-- -- 由于只有两位我们按照两位的编码来排,但是我们发现这行不通,
-- -- 因为第7位不是0因此,返回"?"
-- --
-- --例2:0x4f60的二进制:
-- -- 0 1 0 0 1 1 1 1 0 1 1 0 0 0 0 0
-- -- 我们用utf-8补齐,变成:
-- -- 11100100 10111101 10100000
-- -- e4--bd-- a0
-- -- 于是返回0xe4,0xbd,0xa0
-- --
3.string和byte[]
--string其实核心是char[],然而要把byte转化成string,必须经过编码。
--string.length()其实就是char数组的长度,如果使用不同的编码,很可
--能会错分,造成散字和乱码。
--例:
----byte [] b={(byte)'\u00c4',(byte)'\u00e3'};
----string str=new string(b,encoding); ----
----如果encoding=8859_1,会有两个字,但是encoding=gb2312只有一个字 ----
--这个问题在处理分页是经常发生
但是我不知道应该怎么处理
谁有高见,请指点指点,分不够可以再加!!!!!
我现在用字节数组,用三个三个处理(因为一个汉字对应UTF-8时是三个字节)。不过要补多一个byte凑成四位
显示是正常,但是取出来再转的时候就有问题啦,因为是补齐的,所以其实编码还是有问题。
源数据(GBK)----->UTF-8编码格式------->GBK编码格式保存。我在win2000 server中操作,我想系统默认的编码是相同的。
其实源数据(GBK)----->UTF-8编码格式这一步是没有问题的,这一步可以正常转换。只是:
UTF-8编码格式------->GBK编码格式保存。
这一步出现问题。
UTF-8将一个汉字分成三个字节长度,要想将这样三个字节长度转换回GBK,那应该需要怎么做呢??
也许说了这么多都没有什么用,也许有直接的方法可以将UTF8编码格式的字符串(包含汉字)转换成GBK编码格式,但是我不知道啊!!
String str=s;
try{
byte[] utf8Bytes = str.getBytes("UTF-8");
str=new String(utf8Bytes,"GBK");
return str;
}catch(UnsupportedEncodingException uex){}
return null;
}说白了就是这样处理,这时的参数s是一串中文汉字(GBK编码格式)。有时间的话,研究一下JAVA对字符串的处理机制吧,理解透彻了,中文问题也就不是问题了……------------请问哪里有这方面的资料呢???权威的资料??
为什么要这样呢?这种转法很奇怪的,应该是从以前的一些解决中文问题的文章看来的吧?别这样作……你贴的代码太少,我还是不明白你干嘛要这样转……
new String(str.getBytes("UTF-8"));//变成空串这样都已经有问题啦,我打印这个串,已经变成了空串!!。
new String(str.getBytes("UTF-8"));//将三个汉字的中文字转成UTF8编码格式。其实就是这一步有问题,---现在我才发觉,呵呵,哎,惭愧
一个月不知道的问题,到现在还没forgot it。佩服佩服!:)
public static String RealNameToUTF(String s){
String str=s;
try{
byte[] utf8Bytes = str.getBytes("UTF-8");
str=new String(utf8Bytes,"GBK");
return str;
}catch(UnsupportedEncodingException uex){}
return null;
}
}这个函数没有任何用或说根本不需要。你要的仅仅只是读写时正确读入或写出。你自己看在内部搞什么,你把一个s用UTF-8解成byties然后又用GBK合成字符串。这不相当于把123456先3位一封的123、456然后你又2位一合吗?
问题只需要管好读写即可。不要被那些所谓的中文处理弄的神乎其神,然后昏了头了。其实就只是读写控制而已。
~~~~~~~~~~~~~~~~~~~~~~~~~
给我一条公式,让我看看
0xc4e3 是怎么求出
0xe4,0xbd,0xa0 的?不要叫我看上面,上面我看了,说得不清楚
一直问你干嘛要转过去又转回来,你早说不就结了……你的程序和另外的应用程序是通过一个文本文件打交道,而这个文件只能是UTF8编码,他处理完后也是生成UTF8的文本给你,是这样吗?“但是我发觉真的只有把一个s用UTF-8解成byties然后又用GBK合成字符串,再写进我的文件”从你的描述来看,应该是的。如果是这样,根本就不用转换这么麻烦,你写文件的时候,直接byte[] arrB = String.getBytes("UTF-8"),把得到的字节数组直接写到文件,读文件的时候字节读到一个字节数组,然后再“new String(arrB,"UTF-8")”就行了……说到底,你还是没搞明白JAVA字符串的处理机制啊!
你需要明白下面两点:
1、字符串在内存里面是怎样保存的;
2、String.getBytes("enc")和new String(byte[],"enc")到底干了什么?
搞清楚这两点,JAVA的中文问题就再也不是问题了……希望你得到的是“渔”,而不是“鱼”。
是不能解决的,可能要用到sun.io.CharToByteDoubleByte这个类,或者是sun.io.这个包来解决谁知道这个包可以到哪里下载呢???感激不尽啊???我搜索过了没有找到下载地址。
看SUN的JDK文档,用下面这两个类:
java.io.FileOutputStream
java.io.FilterInputStream“我问过其他的高手,现在认为一般的new String(str.getBytes("dd"),"cc");是不能解决的,可能要用到sun.io.CharToByteDoubleByte这个类,或者是sun.io.这个包来解决”哪里的高手啊,哈哈,这叫简单问题复杂化,真是……BTW:new String(str.getBytes("dd"),"cc");这个语句很多文章都有提及,当很多人并不明白这样作的原理,其实只有一种情况需要你这样作:当你的字符串的实际编码是“CC”,而被系统当成“DD”时,用这个可以得到正确的编码……
ok,可惜啊,现在不是我去操作文件啊,呵呵,只需要我把这个数据put到一个Hashtable里面,由其他软件来使用Hashtable中的内容更新它本身的文件,所以实在没有办法由我字节去写文件。
另外一个软件有个方法updatesetting(string str, Hashtable setting);这样来由另外一个软件来更新文件。
http://expert.csdn.net/Expert/topic/1700/1700489.xml