救急!中文问题!!utf-8编码转成GBK,因为位数不同而产生字符丢掉问题!!

beming 2002-11-12 03:04:02
天啊,又是中文问题:utf-8编码转成GBK,因为位数不同而产生字符丢掉问题!!

某个字段是中文字段,需要将这个字段转成成unicode编码(utf-8去getBytes):
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"编码啊!!
...全文
233 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
teddy_huang 2003-01-22
  • 打赏
  • 举报
回复
mark
fswan 2003-01-22
  • 打赏
  • 举报
回复
这是servlet的一个bug
beming 2002-11-22
  • 打赏
  • 举报
回复
谁可以告诉我在哪里可以下载到sun.io这个包呢??

或者告诉我怎么样将字节数组写到一个文件中呢???
kaney00 2002-11-19
  • 打赏
  • 举报
回复
问题太高深,表示同情慰问一下,嘿嘿
beming 2002-11-19
  • 打赏
  • 举报
回复
在中文环境下,!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编码格式,但是我不知道啊!!
beming 2002-11-15
  • 打赏
  • 举报
回复
我知道,我的参数就是中文GBK编码,但是我就是要将它转成UTF-8编码,再以GBK编码写文件,只要这样处理显示才可以正常啊

我现在用字节数组,用三个三个处理(因为一个汉字对应UTF-8时是三个字节)。不过要补多一个byte凑成四位。显示是正常,但是取出来再转的时候就有问题啦,因为是补齐的,所以其实编码还是有问题。
qinjun999 2002-11-15
  • 打赏
  • 举报
回复
用参数将中文传进来,可以避免编码转换。
也和平台有关,tomcat4我就直接得到汉字而不用转换。
当然这是权宜之计!别的我也不清楚。
beming 2002-11-14
  • 打赏
  • 举报
回复
help

大家给点提示提示吧~!
beming 2002-11-13
  • 打赏
  • 举报
回复
如果使用new String(str.getBytes("UTF-8"),"GBK");处理
出现的情况则是
如果是汉字有偶数个,则转换没有问题,但是如果是奇数个汉字,则最后一个汉字显示不出(怀疑是缺少了后半个byte).
怎么办啊??
beming 2002-11-12
  • 打赏
  • 举报
回复
我已经参考过:

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只有一个字  ----
  --这个问题在处理分页是经常发生


但是我不知道应该怎么处理
谁有高见,请指点指点,分不够可以再加!!!!!

81,091

社区成员

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

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