从字节缓冲区将字符读入字符串

时间:2012-01-15 20:30:03

标签: java unicode buffer cjk

所以我有一个包含文本和其他数据的char []数组。

如何从char []数组中提取中文文本?现在我可以通过

获得英语
public String getString(int index, int length) {
    String str = "";

    for (int i = 0; i < length && this.data[index + i] != 0; i++)
        str = str + this.data[index + i];

    return str;
}

然后我正在尝试这个:

try {
    String charset = "GB18030";
    String str = new String(m.target.getBytes("UTF-16"), "GB18030");
    System.out.println(str);
    System.out.println(str.equals("大家"));
} catch (UnsupportedEncodingException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

m.target是一个我从byte []数组获得的字符串,上面有getString()。我已经尝试了各种编码和它们的组合,它们都没有正确地显示文本(大家)并且没有一个会为str.equals(“大家”)返回true

修改

使用这种方法我可以成功获得中文字符。

public String test(int index, int length) {
    byte[] t = new byte[this.data.length];

    for (int i = 0; i < this.data.length; i++)
        t[i] = (byte) this.data[i];

    try {
        return new String(t, index, length, "GB18030");
    } catch (UnsupportedEncodingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return null;
}

但我现在的问题是......我认为最大一个字节可能是127?字节数组如何保存高字节汉字?我可以安全地将缓冲区更改为byte []而不是char []吗?

1 个答案:

答案 0 :(得分:4)

Java中的 char String 都是Unicode。只要在Java代码中对它进行操作,您就不必关心它。您在转换为 byte [] 数组或从 IO流读取/写入时指定编码。

要声明包含中文字符的String,您可以使用转义序列或只在代码中编写它们,但您必须关注文件编码。 UTF-8 格式现在是准标准格式,它受IDE(例如Eclipse)和构建工具(maven,ant)的支持。

所以你要写

char ch = '大';
char[] chrs = new char[]{'大','家'};
String str = "大家";

要从例如 UTF-16 编码文件中读取中文字符,请使用 InputStreamReader 指定正确的编码,然后您可以读取字符串f.e。借助 BufferedReader

    BufferedReader reader = new BufferedReader(new InputStreamReader(
        new FileInputStream("myfile.txt"), "UTF-16"));