我已经参考过: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只有一个字  ---- 
  --这个问题在处理分页是经常发生 
但是我不知道应该怎么处理
谁有高见,请指点指点,分不够可以再加!!!!!

解决方案 »

  1.   

    三个系统?三种编码?你应该保持JAVA里面的编码不变,然后系统需要什么编码才能显示就转换成什么编码就行了,千万别转过去又转回来,这样肯定会出问题的……UTF8是用3个字节表示的,GBK是2个,所以你把3个UTF编码的汉字转成GBK再转回来肯定会出问题……我的解决办法是,不是系统什么编码,反正我只用一种,字符串用字节数组来保存,然后需要输出的地方再根据需要生成不同编码的字符串……
      

  2.   

    to:ender(ender) ( ) 我想应该是好办法,那么你可以说说具体的方法吗????
      

  3.   

    to: ender(ender) 我的解决办法是,不是系统什么编码,反正我只用一种,字符串用字节数组来保存,然后需要输出的地方再根据需要生成不同编码的字符串……不如给个例子吧,我只是一个新手而已~~给个提示提示吧~1
      

  4.   

    我已经用过字节数组啦,但是UTF8是采用3位,GBK是2位吧?所以怎么补齐啊??我试过有些可以补齐,但是有些又是乱码啦,我不知道怎么做啊,已经困扰我差不多半个月啦!!
      

  5.   


    我现在用字节数组,用三个三个处理(因为一个汉字对应UTF-8时是三个字节)。不过要补多一个byte凑成四位
    显示是正常,但是取出来再转的时候就有问题啦,因为是补齐的,所以其实编码还是有问题。
      

  6.   

    天,你居然自己去补……当然会出问题了,看看UTF8的编码格式,每个CHAR的长度不是一定的,在中文环境下,可能是1个字节(如果是ASCII字符),也可能是3个(中文)……还是先说说你的需求吧:数据源在哪里获取?用的什么编码?是一定的吗?然后需要在什么地方转换为其他编码?系统的默认编码是相同的吗?要解决JAVA的中文编码问题,这些是必须了解的……
      

  7.   

    我当然已经了解啦,在中文环境下,的确给你说的一样!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编码格式,但是我不知道啊!!
      

  8.   

    “要解决JAVA的中文编码问题,这些是必须了解的……”——你当然了解,但你不告诉我,我怎么知道啊:)还是不很理解你为什么要这样转——就和转圈一样,转太多了,头就晕了:)照我的理解,你应该是这样操作的:先是一个String,系统和String的实际编码是一致的,都是GBK,然后把这个String转换为UTF8的编码(这一步你是怎么作的?String.getBytes("UTF-8")吗?转换以后怎么储存的?是存的String还是byte[]?)问题太多了,你还是把你每一步转换的代码和转换时的系统默认编码都贴上来,才能分析清楚。有时间的话,研究一下JAVA对字符串的处理机制吧,理解透彻了,中文问题也就不是问题了……
      

  9.   

    TO: ender(ender)不知兄台对中文问题是怎样解决的,可否在此一叙?多谢!
      

  10.   

    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对字符串的处理机制吧,理解透彻了,中文问题也就不是问题了……------------请问哪里有这方面的资料呢???权威的资料??
      

  11.   

    “str=new String(utf8Bytes,"GBK");”这样不行的,这里就出问题了……
    为什么要这样呢?这种转法很奇怪的,应该是从以前的一些解决中文问题的文章看来的吧?别这样作……你贴的代码太少,我还是不明白你干嘛要这样转……
      

  12.   

    现在这样就有问题啦,就算不进行str=new String(utf8Bytes,"GBK")这样的处理:String str = "三个字";
    new String(str.getBytes("UTF-8"));//变成空串这样都已经有问题啦,我打印这个串,已经变成了空串!!。
      

  13.   

    很感谢你的关注或者你可以解决这样的处理就ok啦:String str = "三个字";
    new String(str.getBytes("UTF-8"));//将三个汉字的中文字转成UTF8编码格式。其实就是这一步有问题,---现在我才发觉,呵呵,哎,惭愧
      

  14.   

    问题在这str=new String(utf8Bytes,"GBK");吧,你把UTF8的编码字节强行用GBK解析,他不解错才怪呢。:)
      

  15.   

    不过还是很佩服老兄,既然把那不得编码格式也给仔细研究呢。:)
    一个月不知道的问题,到现在还没forgot it。佩服佩服!:)
      

  16.   

    help!!问题在这str=new String(utf8Bytes,"GBK");
      

  17.   

    不明白,你要怎样帮你?:)只要自己写的文件全部用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位一合吗?
    问题只需要管好读写即可。不要被那些所谓的中文处理弄的神乎其神,然后昏了头了。其实就只是读写控制而已。
      

  18.   

    但是我发觉真的只有把一个s用UTF-8解成byties然后又用GBK合成字符串,再写进我的文件,这样才能够由另外的软件读取这个数据并显示正确啊。如果单单是转成UTF-8数据,显示都是??号,于是我将一个s用UTF-8解成byties然后又用GBK合成字符串再写,却正确。所以我才有这个问题啊上面我所说的另外的软件是一种应用软件,所有的数据都要用UTF-8编码格式读写。
      

  19.   

    你读的时候是什么编码就用什么编码读,你写时用GBK,其他软件再读你的GBK嘛(你说的)。我觉得你可能搞混了思路。:)
      

  20.   

    也就是说,你直接用GBK写就行了,程序内不需要先解析后合并,只需要写文件时直接用GBK就行了。你试试看!应该是这样,我没自己写过。
      

  21.   

    to Iforgot(清风雨): 他已经钻在牛角尖上了:)to beming(Aming) : 将你的需求说一下,大一点范围,可能会发现其实我们并不用作这样的转换呢?:)
      

  22.   

    我已经说不清楚啦,其实本身我也不是很清楚怎么转,反正如果我要对数据进行操作,我必须ALL data is in UTF-8呵呵~我要钻钻钻~其实大家不要理怎么转,说说大家的对UTF-8和GBK之间转换的看法就OK啦
                                     ~~~~~~~~~~~~~~~~~~~~~~~~~
      

  23.   

    utf-8我不太熟,
    给我一条公式,让我看看
    0xc4e3 是怎么求出
    0xe4,0xbd,0xa0 的?不要叫我看上面,上面我看了,说得不清楚
      

  24.   

    哈哈,还没解决啊?
    一直问你干嘛要转过去又转回来,你早说不就结了……你的程序和另外的应用程序是通过一个文本文件打交道,而这个文件只能是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的中文问题就再也不是问题了……希望你得到的是“渔”,而不是“鱼”。
      

  25.   

    BTW:你的哪种转过去再转回来的思路是行不通的……
      

  26.   

    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.这个包来解决谁知道这个包可以到哪里下载呢???感激不尽啊???我搜索过了没有找到下载地址。
      

  27.   

    to:ender(ender) ( )我明白你的意思,但是有一点不知怎么做:“你写文件的时候,直接byte[] arrB = String.getBytes("UTF-8"),把得到的字节数组直接写到文件,”。----怎样才能把字节数组写到文件??呵呵,我不是很熟悉操作,可以说说怎么写吗???我想也有可能应该这样做,多谢!!
      

  28.   

    啊,老大,这是最基本的操作啊……
    看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”时,用这个可以得到正确的编码……
      

  29.   

    明白!
    ok,可惜啊,现在不是我去操作文件啊,呵呵,只需要我把这个数据put到一个Hashtable里面,由其他软件来使用Hashtable中的内容更新它本身的文件,所以实在没有办法由我字节去写文件。
      

  30.   

    你的内存中的Hashtable是怎么交给另一个软件的?
      

  31.   


    另外一个软件有个方法updatesetting(string str, Hashtable setting);这样来由另外一个软件来更新文件。
      

  32.   

    奇数汉字与偶数汉字的问题!!!请帮忙!!!
    http://expert.csdn.net/Expert/topic/1700/1700489.xml