2012-01-15 32 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")); 
相關問題