2012-01-15 31 views
4

所以,我有一个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?字节数组如何保存高字节汉字?我可以安全地将缓冲区更改为字节[]而不是char []?

+0

的帮助你为什么要同时使用' “UTF-16”'和' “GB18030”'?为什么不这样做:'new String(this.data,offset,length,“UTF-16”)'? – 2012-01-15 20:39:19

+0

我错误说我是使用用于一个this.data byte []数组。它实际上是一个字符数组。如果它是一个字节[]数组不会无法保存unicode文本?由于一个字节可以容纳的最大值是127? – marcaddeo 2012-01-15 20:45:51

+0

'char []'将包含UTF-16代码单元的文本。一个'byte []'可以包含任何编码中的文本,因为文本编码只不过是一种将字符编号映射为字节的方式。 – Joey 2012-01-15 20:59:39

回答

3

Both char and Java中的字符串是Unicode。只要您在Java代码中对其进行操作,就不必关心这个问题。而从字节[]数组转换/指定编码或从IO流读/写/。

要声明包含您可以使用转义序列或只写他们在中国的代码字符的字符串,但你必须关心则有关文件编码。 UTF-8格式是准标准的今天,它是由两个IDE的(如Eclipse)和构建工具(Maven的,蚂蚁)的支持。

所以,你只写

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")); 
相关问题