str=new String(s.getBytes("UTF-8"),"ISO8859-1");
无论这个字段是奇数或者偶数个中文字,都没有发现丢掉汉字的问题。
但是经过
str=new String(s.getBytes("ISO8859-1"),"GBK");
处理过之后,发现偶数个中文字没有问题,但是奇数个中文字的最后一个汉字给丢掉啦!!
怎么办啊??
我必须要这样处理啊 ,我必须要想用str=new String(s.getBytes("UTF-8"),"ISO8859-1");这样处理,之后再要将这个str转换成"GBK"编码啊!!
39 个解决方案
#1
我已经参考过:
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
--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只有一个字 ----
--这个问题在处理分页是经常发生
但是我不知道应该怎么处理
谁有高见,请指点指点,分不够可以再加!!!!!
#2
你到底要干嘛啊?为什么要在三种编码中转来转去的?
#3
因为在一些系统中一定要这样处理过才可以正常显示出中文,我也不想啊~~
#4
三个系统?三种编码?你应该保持JAVA里面的编码不变,然后系统需要什么编码才能显示就转换成什么编码就行了,千万别转过去又转回来,这样肯定会出问题的……
UTF8是用3个字节表示的,GBK是2个,所以你把3个UTF编码的汉字转成GBK再转回来肯定会出问题……
我的解决办法是,不是系统什么编码,反正我只用一种,字符串用字节数组来保存,然后需要输出的地方再根据需要生成不同编码的字符串……
UTF8是用3个字节表示的,GBK是2个,所以你把3个UTF编码的汉字转成GBK再转回来肯定会出问题……
我的解决办法是,不是系统什么编码,反正我只用一种,字符串用字节数组来保存,然后需要输出的地方再根据需要生成不同编码的字符串……
#5
to:ender(ender) ( )
我想应该是好办法,那么你可以说说具体的方法吗????
我想应该是好办法,那么你可以说说具体的方法吗????
#6
啊?还不够清楚吗?
#7
rui
#8
to: ender(ender)
我的解决办法是,不是系统什么编码,反正我只用一种,字符串用字节数组来保存,然后需要输出的地方再根据需要生成不同编码的字符串……
不如给个例子吧,我只是一个新手而已~~
给个提示提示吧~1
我的解决办法是,不是系统什么编码,反正我只用一种,字符串用字节数组来保存,然后需要输出的地方再根据需要生成不同编码的字符串……
不如给个例子吧,我只是一个新手而已~~
给个提示提示吧~1
#9
我已经用过字节数组啦,但是UTF8是采用3位,GBK是2位吧?所以怎么补齐啊??
我试过有些可以补齐,但是有些又是乱码啦,我不知道怎么做啊,已经困扰我差不多半个月啦!!
我试过有些可以补齐,但是有些又是乱码啦,我不知道怎么做啊,已经困扰我差不多半个月啦!!
#10
我现在用字节数组,用三个三个处理(因为一个汉字对应UTF-8时是三个字节)。不过要补多一个byte凑成四位
显示是正常,但是取出来再转的时候就有问题啦,因为是补齐的,所以其实编码还是有问题。
#11
天,你居然自己去补……当然会出问题了,看看UTF8的编码格式,每个CHAR的长度不是一定的,在中文环境下,可能是1个字节(如果是ASCII字符),也可能是3个(中文)……
还是先说说你的需求吧:数据源在哪里获取?用的什么编码?是一定的吗?然后需要在什么地方转换为其他编码?系统的默认编码是相同的吗?
要解决JAVA的中文编码问题,这些是必须了解的……
还是先说说你的需求吧:数据源在哪里获取?用的什么编码?是一定的吗?然后需要在什么地方转换为其他编码?系统的默认编码是相同的吗?
要解决JAVA的中文编码问题,这些是必须了解的……
#12
我当然已经了解啦,在中文环境下,的确给你说的一样!UTF-8编码格式中字符占一个字节,汉字占三个字节
我的数据源从表单中获取,也可以是程序中赋值中文,是用GBK格式的,一定是GBK编码格式,我已经打印过证明,我要把这个中文字段put到一个hashtable里面,进行存储过程,我就在put进hashtable之前转换成UTF-8编码格式再作转换成GBK格式,过程其实如下:
源数据(GBK)----->UTF-8编码格式------->GBK编码格式保存。
我在win2000 server中操作,我想系统默认的编码是相同的。
其实源数据(GBK)----->UTF-8编码格式这一步是没有问题的,这一步可以正常转换。只是:
UTF-8编码格式------->GBK编码格式保存。
这一步出现问题。
UTF-8将一个汉字分成三个字节长度,要想将这样三个字节长度转换回GBK,那应该需要怎么做呢??
也许说了这么多都没有什么用,也许有直接的方法可以将UTF8编码格式的字符串(包含汉字)转换成GBK编码格式,但是我不知道啊!!
我的数据源从表单中获取,也可以是程序中赋值中文,是用GBK格式的,一定是GBK编码格式,我已经打印过证明,我要把这个中文字段put到一个hashtable里面,进行存储过程,我就在put进hashtable之前转换成UTF-8编码格式再作转换成GBK格式,过程其实如下:
源数据(GBK)----->UTF-8编码格式------->GBK编码格式保存。
我在win2000 server中操作,我想系统默认的编码是相同的。
其实源数据(GBK)----->UTF-8编码格式这一步是没有问题的,这一步可以正常转换。只是:
UTF-8编码格式------->GBK编码格式保存。
这一步出现问题。
UTF-8将一个汉字分成三个字节长度,要想将这样三个字节长度转换回GBK,那应该需要怎么做呢??
也许说了这么多都没有什么用,也许有直接的方法可以将UTF8编码格式的字符串(包含汉字)转换成GBK编码格式,但是我不知道啊!!
#13
“要解决JAVA的中文编码问题,这些是必须了解的……”——你当然了解,但你不告诉我,我怎么知道啊:)
还是不很理解你为什么要这样转——就和转圈一样,转太多了,头就晕了:)
照我的理解,你应该是这样操作的:先是一个String,系统和String的实际编码是一致的,都是GBK,然后把这个String转换为UTF8的编码(这一步你是怎么作的?String.getBytes("UTF-8")吗?转换以后怎么储存的?是存的String还是byte[]?)问题太多了,你还是把你每一步转换的代码和转换时的系统默认编码都贴上来,才能分析清楚。
有时间的话,研究一下JAVA对字符串的处理机制吧,理解透彻了,中文问题也就不是问题了……
还是不很理解你为什么要这样转——就和转圈一样,转太多了,头就晕了:)
照我的理解,你应该是这样操作的:先是一个String,系统和String的实际编码是一致的,都是GBK,然后把这个String转换为UTF8的编码(这一步你是怎么作的?String.getBytes("UTF-8")吗?转换以后怎么储存的?是存的String还是byte[]?)问题太多了,你还是把你每一步转换的代码和转换时的系统默认编码都贴上来,才能分析清楚。
有时间的话,研究一下JAVA对字符串的处理机制吧,理解透彻了,中文问题也就不是问题了……
#14
TO: ender(ender)
不知兄台对中文问题是怎样解决的,可否在此一叙?
多谢!
不知兄台对中文问题是怎样解决的,可否在此一叙?
多谢!
#15
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是一串中文汉字(GBK编码格式)。
有时间的话,研究一下JAVA对字符串的处理机制吧,理解透彻了,中文问题也就不是问题了……------------请问哪里有这方面的资料呢???权威的资料??
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对字符串的处理机制吧,理解透彻了,中文问题也就不是问题了……------------请问哪里有这方面的资料呢???权威的资料??
#16
“str=new String(utf8Bytes,"GBK");”这样不行的,这里就出问题了……
为什么要这样呢?这种转法很奇怪的,应该是从以前的一些解决中文问题的文章看来的吧?别这样作……
你贴的代码太少,我还是不明白你干嘛要这样转……
为什么要这样呢?这种转法很奇怪的,应该是从以前的一些解决中文问题的文章看来的吧?别这样作……
你贴的代码太少,我还是不明白你干嘛要这样转……
#17
现在这样就有问题啦,就算不进行str=new String(utf8Bytes,"GBK")这样的处理:
String str = "三个字";
new String(str.getBytes("UTF-8"));//变成空串
这样都已经有问题啦,我打印这个串,已经变成了空串!!。
String str = "三个字";
new String(str.getBytes("UTF-8"));//变成空串
这样都已经有问题啦,我打印这个串,已经变成了空串!!。
#18
很感谢你的关注
或者你可以解决这样的处理就ok啦:
String str = "三个字";
new String(str.getBytes("UTF-8"));//将三个汉字的中文字转成UTF8编码格式。
其实就是这一步有问题,---现在我才发觉,呵呵,哎,惭愧
或者你可以解决这样的处理就ok啦:
String str = "三个字";
new String(str.getBytes("UTF-8"));//将三个汉字的中文字转成UTF8编码格式。
其实就是这一步有问题,---现在我才发觉,呵呵,哎,惭愧
#19
问题在这str=new String(utf8Bytes,"GBK");吧,你把UTF8的编码字节强行用GBK解析,他不解错才怪呢。:)
#20
不过还是很佩服老兄,既然把那不得编码格式也给仔细研究呢。:)
一个月不知道的问题,到现在还没forgot it。佩服佩服!:)
一个月不知道的问题,到现在还没forgot it。佩服佩服!:)
#21
help!!
问题在这str=new String(utf8Bytes,"GBK");
问题在这str=new String(utf8Bytes,"GBK");
#22
不明白,你要怎样帮你?:)
只要自己写的文件全部用UTF-8读写,系统的就用相应的编码读写,度进来后用UTF-8写成自己的好了。
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位一合吗?
问题只需要管好读写即可。不要被那些所谓的中文处理弄的神乎其神,然后昏了头了。其实就只是读写控制而已。
只要自己写的文件全部用UTF-8读写,系统的就用相应的编码读写,度进来后用UTF-8写成自己的好了。
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位一合吗?
问题只需要管好读写即可。不要被那些所谓的中文处理弄的神乎其神,然后昏了头了。其实就只是读写控制而已。
#23
但是我发觉真的只有把一个s用UTF-8解成byties然后又用GBK合成字符串,再写进我的文件,这样才能够由另外的软件读取这个数据并显示正确啊。
如果单单是转成UTF-8数据,显示都是??号,于是我将一个s用UTF-8解成byties然后又用GBK合成字符串再写,却正确。所以我才有这个问题啊
上面我所说的另外的软件是一种应用软件,所有的数据都要用UTF-8编码格式读写。
如果单单是转成UTF-8数据,显示都是??号,于是我将一个s用UTF-8解成byties然后又用GBK合成字符串再写,却正确。所以我才有这个问题啊
上面我所说的另外的软件是一种应用软件,所有的数据都要用UTF-8编码格式读写。
#24
你读的时候是什么编码就用什么编码读,你写时用GBK,其他软件再读你的GBK嘛(你说的)。
我觉得你可能搞混了思路。:)
我觉得你可能搞混了思路。:)
#25
也就是说,你直接用GBK写就行了,程序内不需要先解析后合并,只需要写文件时直接用GBK就行了。你试试看!应该是这样,我没自己写过。
#26
to Iforgot(清风雨): 他已经钻在牛角尖上了:)
to beming(Aming) : 将你的需求说一下,大一点范围,可能会发现其实我们并不用作这样的转换呢?:)
to beming(Aming) : 将你的需求说一下,大一点范围,可能会发现其实我们并不用作这样的转换呢?:)
#27
我已经说不清楚啦,其实本身我也不是很清楚怎么转,反正如果我要对数据进行操作,我必须ALL data is in UTF-8
呵呵~我要钻钻钻~
其实大家不要理怎么转,说说大家的对UTF-8和GBK之间转换的看法就OK啦
~~~~~~~~~~~~~~~~~~~~~~~~~
呵呵~我要钻钻钻~
其实大家不要理怎么转,说说大家的对UTF-8和GBK之间转换的看法就OK啦
~~~~~~~~~~~~~~~~~~~~~~~~~
#28
utf-8我不太熟,
给我一条公式,让我看看
0xc4e3 是怎么求出
0xe4,0xbd,0xa0 的?
不要叫我看上面,上面我看了,说得不清楚
给我一条公式,让我看看
0xc4e3 是怎么求出
0xe4,0xbd,0xa0 的?
不要叫我看上面,上面我看了,说得不清楚
#29
哈哈,还没解决啊?
一直问你干嘛要转过去又转回来,你早说不就结了……
你的程序和另外的应用程序是通过一个文本文件打交道,而这个文件只能是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的中文问题就再也不是问题了……
希望你得到的是“渔”,而不是“鱼”。
一直问你干嘛要转过去又转回来,你早说不就结了……
你的程序和另外的应用程序是通过一个文本文件打交道,而这个文件只能是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的中文问题就再也不是问题了……
希望你得到的是“渔”,而不是“鱼”。
#30
BTW:你的哪种转过去再转回来的思路是行不通的……
#31
Thanks so much,i see,and I had tried it! but ...
I can't finish it!
我问过其他的高手,现在认为一般的new String(str.getBytes("dd"),"cc");
是不能解决的,可能要用到sun.io.CharToByteDoubleByte这个类,或者是sun.io.这个包来解决
谁知道这个包可以到哪里下载呢???感激不尽啊???我搜索过了没有找到下载地址。
I can't finish it!
我问过其他的高手,现在认为一般的new String(str.getBytes("dd"),"cc");
是不能解决的,可能要用到sun.io.CharToByteDoubleByte这个类,或者是sun.io.这个包来解决
谁知道这个包可以到哪里下载呢???感激不尽啊???我搜索过了没有找到下载地址。
#32
to:ender(ender) ( )
我明白你的意思,但是有一点不知怎么做:“你写文件的时候,直接byte[] arrB = String.getBytes("UTF-8"),把得到的字节数组直接写到文件,”。----怎样才能把字节数组写到文件??
呵呵,我不是很熟悉操作,可以说说怎么写吗???我想也有可能应该这样做,多谢!!
我明白你的意思,但是有一点不知怎么做:“你写文件的时候,直接byte[] arrB = String.getBytes("UTF-8"),把得到的字节数组直接写到文件,”。----怎样才能把字节数组写到文件??
呵呵,我不是很熟悉操作,可以说说怎么写吗???我想也有可能应该这样做,多谢!!
#33
啊,老大,这是最基本的操作啊……
看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”时,用这个可以得到正确的编码……
看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”时,用这个可以得到正确的编码……
#34
明白!
ok,
可惜啊,现在不是我去操作文件啊,呵呵,只需要我把这个数据put到一个Hashtable里面,由其他软件来使用Hashtable中的内容更新它本身的文件,所以实在没有办法由我字节去写文件。
ok,
可惜啊,现在不是我去操作文件啊,呵呵,只需要我把这个数据put到一个Hashtable里面,由其他软件来使用Hashtable中的内容更新它本身的文件,所以实在没有办法由我字节去写文件。
#35
你的内存中的Hashtable是怎么交给另一个软件的?
#36
另外一个软件有个方法updatesetting(string str, Hashtable setting);
这样来由另外一个软件来更新文件。
#37
我已经解决啦,哈哈~~不枉大家的努力帮助和我的不懈努力!!!
#38
晕~~,真够长的、、、
#39
奇数汉字与偶数汉字的问题!!!请帮忙!!!
http://expert.csdn.net/Expert/topic/1700/1700489.xml
http://expert.csdn.net/Expert/topic/1700/1700489.xml
#1
我已经参考过:
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
--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只有一个字 ----
--这个问题在处理分页是经常发生
但是我不知道应该怎么处理
谁有高见,请指点指点,分不够可以再加!!!!!
#2
你到底要干嘛啊?为什么要在三种编码中转来转去的?
#3
因为在一些系统中一定要这样处理过才可以正常显示出中文,我也不想啊~~
#4
三个系统?三种编码?你应该保持JAVA里面的编码不变,然后系统需要什么编码才能显示就转换成什么编码就行了,千万别转过去又转回来,这样肯定会出问题的……
UTF8是用3个字节表示的,GBK是2个,所以你把3个UTF编码的汉字转成GBK再转回来肯定会出问题……
我的解决办法是,不是系统什么编码,反正我只用一种,字符串用字节数组来保存,然后需要输出的地方再根据需要生成不同编码的字符串……
UTF8是用3个字节表示的,GBK是2个,所以你把3个UTF编码的汉字转成GBK再转回来肯定会出问题……
我的解决办法是,不是系统什么编码,反正我只用一种,字符串用字节数组来保存,然后需要输出的地方再根据需要生成不同编码的字符串……
#5
to:ender(ender) ( )
我想应该是好办法,那么你可以说说具体的方法吗????
我想应该是好办法,那么你可以说说具体的方法吗????
#6
啊?还不够清楚吗?
#7
rui
#8
to: ender(ender)
我的解决办法是,不是系统什么编码,反正我只用一种,字符串用字节数组来保存,然后需要输出的地方再根据需要生成不同编码的字符串……
不如给个例子吧,我只是一个新手而已~~
给个提示提示吧~1
我的解决办法是,不是系统什么编码,反正我只用一种,字符串用字节数组来保存,然后需要输出的地方再根据需要生成不同编码的字符串……
不如给个例子吧,我只是一个新手而已~~
给个提示提示吧~1
#9
我已经用过字节数组啦,但是UTF8是采用3位,GBK是2位吧?所以怎么补齐啊??
我试过有些可以补齐,但是有些又是乱码啦,我不知道怎么做啊,已经困扰我差不多半个月啦!!
我试过有些可以补齐,但是有些又是乱码啦,我不知道怎么做啊,已经困扰我差不多半个月啦!!
#10
我现在用字节数组,用三个三个处理(因为一个汉字对应UTF-8时是三个字节)。不过要补多一个byte凑成四位
显示是正常,但是取出来再转的时候就有问题啦,因为是补齐的,所以其实编码还是有问题。
#11
天,你居然自己去补……当然会出问题了,看看UTF8的编码格式,每个CHAR的长度不是一定的,在中文环境下,可能是1个字节(如果是ASCII字符),也可能是3个(中文)……
还是先说说你的需求吧:数据源在哪里获取?用的什么编码?是一定的吗?然后需要在什么地方转换为其他编码?系统的默认编码是相同的吗?
要解决JAVA的中文编码问题,这些是必须了解的……
还是先说说你的需求吧:数据源在哪里获取?用的什么编码?是一定的吗?然后需要在什么地方转换为其他编码?系统的默认编码是相同的吗?
要解决JAVA的中文编码问题,这些是必须了解的……
#12
我当然已经了解啦,在中文环境下,的确给你说的一样!UTF-8编码格式中字符占一个字节,汉字占三个字节
我的数据源从表单中获取,也可以是程序中赋值中文,是用GBK格式的,一定是GBK编码格式,我已经打印过证明,我要把这个中文字段put到一个hashtable里面,进行存储过程,我就在put进hashtable之前转换成UTF-8编码格式再作转换成GBK格式,过程其实如下:
源数据(GBK)----->UTF-8编码格式------->GBK编码格式保存。
我在win2000 server中操作,我想系统默认的编码是相同的。
其实源数据(GBK)----->UTF-8编码格式这一步是没有问题的,这一步可以正常转换。只是:
UTF-8编码格式------->GBK编码格式保存。
这一步出现问题。
UTF-8将一个汉字分成三个字节长度,要想将这样三个字节长度转换回GBK,那应该需要怎么做呢??
也许说了这么多都没有什么用,也许有直接的方法可以将UTF8编码格式的字符串(包含汉字)转换成GBK编码格式,但是我不知道啊!!
我的数据源从表单中获取,也可以是程序中赋值中文,是用GBK格式的,一定是GBK编码格式,我已经打印过证明,我要把这个中文字段put到一个hashtable里面,进行存储过程,我就在put进hashtable之前转换成UTF-8编码格式再作转换成GBK格式,过程其实如下:
源数据(GBK)----->UTF-8编码格式------->GBK编码格式保存。
我在win2000 server中操作,我想系统默认的编码是相同的。
其实源数据(GBK)----->UTF-8编码格式这一步是没有问题的,这一步可以正常转换。只是:
UTF-8编码格式------->GBK编码格式保存。
这一步出现问题。
UTF-8将一个汉字分成三个字节长度,要想将这样三个字节长度转换回GBK,那应该需要怎么做呢??
也许说了这么多都没有什么用,也许有直接的方法可以将UTF8编码格式的字符串(包含汉字)转换成GBK编码格式,但是我不知道啊!!
#13
“要解决JAVA的中文编码问题,这些是必须了解的……”——你当然了解,但你不告诉我,我怎么知道啊:)
还是不很理解你为什么要这样转——就和转圈一样,转太多了,头就晕了:)
照我的理解,你应该是这样操作的:先是一个String,系统和String的实际编码是一致的,都是GBK,然后把这个String转换为UTF8的编码(这一步你是怎么作的?String.getBytes("UTF-8")吗?转换以后怎么储存的?是存的String还是byte[]?)问题太多了,你还是把你每一步转换的代码和转换时的系统默认编码都贴上来,才能分析清楚。
有时间的话,研究一下JAVA对字符串的处理机制吧,理解透彻了,中文问题也就不是问题了……
还是不很理解你为什么要这样转——就和转圈一样,转太多了,头就晕了:)
照我的理解,你应该是这样操作的:先是一个String,系统和String的实际编码是一致的,都是GBK,然后把这个String转换为UTF8的编码(这一步你是怎么作的?String.getBytes("UTF-8")吗?转换以后怎么储存的?是存的String还是byte[]?)问题太多了,你还是把你每一步转换的代码和转换时的系统默认编码都贴上来,才能分析清楚。
有时间的话,研究一下JAVA对字符串的处理机制吧,理解透彻了,中文问题也就不是问题了……
#14
TO: ender(ender)
不知兄台对中文问题是怎样解决的,可否在此一叙?
多谢!
不知兄台对中文问题是怎样解决的,可否在此一叙?
多谢!
#15
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是一串中文汉字(GBK编码格式)。
有时间的话,研究一下JAVA对字符串的处理机制吧,理解透彻了,中文问题也就不是问题了……------------请问哪里有这方面的资料呢???权威的资料??
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对字符串的处理机制吧,理解透彻了,中文问题也就不是问题了……------------请问哪里有这方面的资料呢???权威的资料??
#16
“str=new String(utf8Bytes,"GBK");”这样不行的,这里就出问题了……
为什么要这样呢?这种转法很奇怪的,应该是从以前的一些解决中文问题的文章看来的吧?别这样作……
你贴的代码太少,我还是不明白你干嘛要这样转……
为什么要这样呢?这种转法很奇怪的,应该是从以前的一些解决中文问题的文章看来的吧?别这样作……
你贴的代码太少,我还是不明白你干嘛要这样转……
#17
现在这样就有问题啦,就算不进行str=new String(utf8Bytes,"GBK")这样的处理:
String str = "三个字";
new String(str.getBytes("UTF-8"));//变成空串
这样都已经有问题啦,我打印这个串,已经变成了空串!!。
String str = "三个字";
new String(str.getBytes("UTF-8"));//变成空串
这样都已经有问题啦,我打印这个串,已经变成了空串!!。
#18
很感谢你的关注
或者你可以解决这样的处理就ok啦:
String str = "三个字";
new String(str.getBytes("UTF-8"));//将三个汉字的中文字转成UTF8编码格式。
其实就是这一步有问题,---现在我才发觉,呵呵,哎,惭愧
或者你可以解决这样的处理就ok啦:
String str = "三个字";
new String(str.getBytes("UTF-8"));//将三个汉字的中文字转成UTF8编码格式。
其实就是这一步有问题,---现在我才发觉,呵呵,哎,惭愧
#19
问题在这str=new String(utf8Bytes,"GBK");吧,你把UTF8的编码字节强行用GBK解析,他不解错才怪呢。:)
#20
不过还是很佩服老兄,既然把那不得编码格式也给仔细研究呢。:)
一个月不知道的问题,到现在还没forgot it。佩服佩服!:)
一个月不知道的问题,到现在还没forgot it。佩服佩服!:)
#21
help!!
问题在这str=new String(utf8Bytes,"GBK");
问题在这str=new String(utf8Bytes,"GBK");
#22
不明白,你要怎样帮你?:)
只要自己写的文件全部用UTF-8读写,系统的就用相应的编码读写,度进来后用UTF-8写成自己的好了。
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位一合吗?
问题只需要管好读写即可。不要被那些所谓的中文处理弄的神乎其神,然后昏了头了。其实就只是读写控制而已。
只要自己写的文件全部用UTF-8读写,系统的就用相应的编码读写,度进来后用UTF-8写成自己的好了。
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位一合吗?
问题只需要管好读写即可。不要被那些所谓的中文处理弄的神乎其神,然后昏了头了。其实就只是读写控制而已。
#23
但是我发觉真的只有把一个s用UTF-8解成byties然后又用GBK合成字符串,再写进我的文件,这样才能够由另外的软件读取这个数据并显示正确啊。
如果单单是转成UTF-8数据,显示都是??号,于是我将一个s用UTF-8解成byties然后又用GBK合成字符串再写,却正确。所以我才有这个问题啊
上面我所说的另外的软件是一种应用软件,所有的数据都要用UTF-8编码格式读写。
如果单单是转成UTF-8数据,显示都是??号,于是我将一个s用UTF-8解成byties然后又用GBK合成字符串再写,却正确。所以我才有这个问题啊
上面我所说的另外的软件是一种应用软件,所有的数据都要用UTF-8编码格式读写。
#24
你读的时候是什么编码就用什么编码读,你写时用GBK,其他软件再读你的GBK嘛(你说的)。
我觉得你可能搞混了思路。:)
我觉得你可能搞混了思路。:)
#25
也就是说,你直接用GBK写就行了,程序内不需要先解析后合并,只需要写文件时直接用GBK就行了。你试试看!应该是这样,我没自己写过。
#26
to Iforgot(清风雨): 他已经钻在牛角尖上了:)
to beming(Aming) : 将你的需求说一下,大一点范围,可能会发现其实我们并不用作这样的转换呢?:)
to beming(Aming) : 将你的需求说一下,大一点范围,可能会发现其实我们并不用作这样的转换呢?:)
#27
我已经说不清楚啦,其实本身我也不是很清楚怎么转,反正如果我要对数据进行操作,我必须ALL data is in UTF-8
呵呵~我要钻钻钻~
其实大家不要理怎么转,说说大家的对UTF-8和GBK之间转换的看法就OK啦
~~~~~~~~~~~~~~~~~~~~~~~~~
呵呵~我要钻钻钻~
其实大家不要理怎么转,说说大家的对UTF-8和GBK之间转换的看法就OK啦
~~~~~~~~~~~~~~~~~~~~~~~~~
#28
utf-8我不太熟,
给我一条公式,让我看看
0xc4e3 是怎么求出
0xe4,0xbd,0xa0 的?
不要叫我看上面,上面我看了,说得不清楚
给我一条公式,让我看看
0xc4e3 是怎么求出
0xe4,0xbd,0xa0 的?
不要叫我看上面,上面我看了,说得不清楚
#29
哈哈,还没解决啊?
一直问你干嘛要转过去又转回来,你早说不就结了……
你的程序和另外的应用程序是通过一个文本文件打交道,而这个文件只能是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的中文问题就再也不是问题了……
希望你得到的是“渔”,而不是“鱼”。
一直问你干嘛要转过去又转回来,你早说不就结了……
你的程序和另外的应用程序是通过一个文本文件打交道,而这个文件只能是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的中文问题就再也不是问题了……
希望你得到的是“渔”,而不是“鱼”。
#30
BTW:你的哪种转过去再转回来的思路是行不通的……
#31
Thanks so much,i see,and I had tried it! but ...
I can't finish it!
我问过其他的高手,现在认为一般的new String(str.getBytes("dd"),"cc");
是不能解决的,可能要用到sun.io.CharToByteDoubleByte这个类,或者是sun.io.这个包来解决
谁知道这个包可以到哪里下载呢???感激不尽啊???我搜索过了没有找到下载地址。
I can't finish it!
我问过其他的高手,现在认为一般的new String(str.getBytes("dd"),"cc");
是不能解决的,可能要用到sun.io.CharToByteDoubleByte这个类,或者是sun.io.这个包来解决
谁知道这个包可以到哪里下载呢???感激不尽啊???我搜索过了没有找到下载地址。
#32
to:ender(ender) ( )
我明白你的意思,但是有一点不知怎么做:“你写文件的时候,直接byte[] arrB = String.getBytes("UTF-8"),把得到的字节数组直接写到文件,”。----怎样才能把字节数组写到文件??
呵呵,我不是很熟悉操作,可以说说怎么写吗???我想也有可能应该这样做,多谢!!
我明白你的意思,但是有一点不知怎么做:“你写文件的时候,直接byte[] arrB = String.getBytes("UTF-8"),把得到的字节数组直接写到文件,”。----怎样才能把字节数组写到文件??
呵呵,我不是很熟悉操作,可以说说怎么写吗???我想也有可能应该这样做,多谢!!
#33
啊,老大,这是最基本的操作啊……
看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”时,用这个可以得到正确的编码……
看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”时,用这个可以得到正确的编码……
#34
明白!
ok,
可惜啊,现在不是我去操作文件啊,呵呵,只需要我把这个数据put到一个Hashtable里面,由其他软件来使用Hashtable中的内容更新它本身的文件,所以实在没有办法由我字节去写文件。
ok,
可惜啊,现在不是我去操作文件啊,呵呵,只需要我把这个数据put到一个Hashtable里面,由其他软件来使用Hashtable中的内容更新它本身的文件,所以实在没有办法由我字节去写文件。
#35
你的内存中的Hashtable是怎么交给另一个软件的?
#36
另外一个软件有个方法updatesetting(string str, Hashtable setting);
这样来由另外一个软件来更新文件。
#37
我已经解决啦,哈哈~~不枉大家的努力帮助和我的不懈努力!!!
#38
晕~~,真够长的、、、
#39
奇数汉字与偶数汉字的问题!!!请帮忙!!!
http://expert.csdn.net/Expert/topic/1700/1700489.xml
http://expert.csdn.net/Expert/topic/1700/1700489.xml