本帖最后由 skmbw 于 2013-09-22 15:58:36 编辑

解决方案 »

  1.   

    char 是双字节的, 得到的结果会不一样哦
      

  2.   

    for (int i = 0; i < text.length(); i++) {
        char c = text.charAt(i);如果你处理的字符 会有中文, text.length()也会有问题。
      

  3.   

    处理的确有中文,char可以表示中文。如果是中文就转换成byte[] b = new byte[2];字母就转换成一个字节。有什么问题?请赐教。
      

  4.   

    处理的确有中文,char可以表示中文。如果是中文就转换成byte[] b = new byte[2];字母就转换成一个字节。有什么问题?请赐教。那里没有问题,
    但是你不能new byte[2], Byte和Char是有区别的。
      

  5.   

    我想使用位运算,这样性能好些。如果使用nio包的方式我是会做的。
    如果是转成UTF-8,下面的操作是可以的:(byte)(0xE0 + (chr >> 12));
    (byte)(0x80 + ((chr >> 6) & 0x3F));
    (byte)(0x80 + (chr & 0x3F));上面代码中的chr是一个字符。
    如果是字符,直接(byte)chr;即可。
    现在的困惑是GBK,的位运算该怎么写。
    请大神们,不吝赐教。
      

  6.   

    处理的确有中文,char可以表示中文。如果是中文就转换成byte[] b = new byte[2];字母就转换成一个字节。有什么问题?请赐教。那里没有问题,
    但是你不能new byte[2], Byte和Char是有区别的。
    是有区别的,所以要通过位运算,将char转成byte[]。
    请不吝赐教。
      

  7.   

    Java的字符集转化都有API的,包括GBK, 研究getBytes()去。
      

  8.   

    嗯,这个我有看过,最后调用了本地方法。本人只会java啊。
      

  9.   

    不知道为何你非要用char来转, 如果实在要用的话,看看这个方法能否满足你的要求吧package study.string.length;import java.io.UnsupportedEncodingException;import sun.io.CharToByteConverter;
    import sun.io.MalformedInputException;public class StrLenght {    public static void main(String[] args) throws UnsupportedEncodingException, MalformedInputException {
            String str = "a中";
            byte[] chars = str.getBytes();
            for (int x = 0; x < chars.length; x++) {
                System.out.println(chars[x]);
            }        print(str);
        }    public static void print(String str) throws UnsupportedEncodingException, MalformedInputException {
            byte[] result = new byte[str.getBytes().length];
            int p = 0;
            for (int i = 0; i < str.length(); i++) {
                char c = str.charAt(i);
                byte l = (byte) c;
                byte h = (byte) (c >> 8);            if (h == 0) {
                    result[p++] = l;
                } else {
                    char[] cs = new char[1];
                    cs[0] = c;                CharToByteConverter converter = CharToByteConverter.getConverter("GBK");
                    byte[] br = converter.convertAll(cs);                result[p++] = br[0];
                    result[p++] = br[1];
                }        }
            for (int x = 0; x < result.length; x++) {
                System.out.println(result[x]);
            }
        }}
      

  10.   

    如果非要一个字符一个字符处理,可以用 CharBuffer。
    不过还是用 String 最简单,一般不会出错。
      

  11.   

    这个使用了sun的私有类和方法。也是一种方法。
      

  12.   

    这个使用了sun的私有类和方法。也是一种方法。是啊,源码那是相当的复杂, 你有空 可以看看研究一下。 
      

  13.   

    我参考了JDK的charset.jar中的,sun.nio.cs.ext.GBK18030.java源码,以及rt.jar中的sun.nio.cs.UTF_8.java的源码。utf的编码可以通过位运算,直接转成字节,因为java内部使用unicode编码,utf-8的编码是规律的,可以直接映射成unicode。而gbk和unicode没有一定的对应关系。多以无法通过位运算转。在GBK18030.java中是完全通过手工的方式映射的。
    而我将GBK18030.java中的代码抽取出来,做成工具类,性能还不如直接使用nio转的效率。
    这是nio的方式:import java.nio.ByteBuffer;
    import java.nio.CharBuffer;
    import java.nio.charset.Charset;
    import java.util.Arrays;public class GBKCharUtils {
    public static final Charset charset = Charset.forName("GBK");

    public static byte[] getBytes(char c) {
    CharBuffer charBuffer = CharBuffer.allocate(1);
    charBuffer.put(c);
    charBuffer.flip();
    ByteBuffer byteBuffer = charset.encode(charBuffer);
    return byteBuffer.array();
    }

    public static byte[] getBytes(char[] chars) {
    CharBuffer charBuffer = CharBuffer.wrap(chars);
    ByteBuffer byteBuffer = charset.encode(charBuffer);
    return byteBuffer.array();
    }

    public static void main(String[] args) {
    CharBuffer charBuffer = CharBuffer.allocate(3);
    charBuffer.put('c');
    charBuffer.put('2');
    charBuffer.put('a');

    System.out.println(Arrays.toString(getBytes('雷')));

    System.out.println(Arrays.toString(getBytes(new char[]{'雷'})));
    }

    }所以还是直接使用nio吧。
    下面是GBK18030.java中抽出去的方法。public void encode(CharBuffer src, ByteBuffer dst) {
                //int hiByte = 0, loByte = 0;
                while (src.hasRemaining()) {
                    char c = src.get();
                    if (c >= 0x0000 && c <= 0x007F) {
                        dst.put((byte)c);
                    } else if (c <= 0xA4C6 || c >= 0xE000) {
                        int outByteVal = getGB18030(encoderIndex1, encoderIndex2, c);
                        //hiByte = (outByteVal & 0xFF00) >> 8;
                        //loByte = outByteVal & 0xFF;                    dst.put((byte)((outByteVal & 0xFF00) >> 8));
                        dst.put((byte)(outByteVal & 0xFF));
                    }
                }
            }其中getGB18030就是做gbk编码和unicode映射的。
    具体的源码,jdk中好像没有,可以下载openjdk的源码看。