2012-08-02 45 views
2

我有一個AS/400回覆文本,它帶有多語言字符串,如下所示,長度爲28872個字符。拆分多語言字符串

2012021920120219000000000300000D000000010146208D22فيراصم

我不得不分割文本每塊240個字符,但如我在我的之間邏輯未能提取確切240字符長度阿拉伯字符。

我的問題是如何拆分多語言文本與失去原始格式?

回答

4

你應該編寫你的代碼,它取決於文本編碼,提取完全240個字符。取決於編碼,字符可能需要幾個字節。常見的編碼是UTF-8。看看維基百科關於UTF-8的工作方式。這將允許您編寫正確的工作代碼。 UTF-8 Description

所以,你應該知道當前字符需要多少字節。

當然,在開始之前,請確保您知道輸入文本的編碼。


知道Java使用UTF-16來存儲字符。所以,這意味着阿拉伯字符可以由多個char組成,因爲代碼點超過2^16。爲了這個正常工作,我將整個字符串轉換爲字節的緩衝區:

String longStringToSplit = ...; 
byte[] stringUTF8 = longStringToSplit.getBytes("UTF-8"); 
// now, split it manually and correct, using the utf-8 specifications you 
// can find in the link I gave you to wiki. 
+0

我擁有的文本是UTF-8格式。當我把它分成每個240個字符時,這些值被錯誤放置。我認爲阿拉伯語與此有關.. – 2012-08-02 09:44:51

+0

但那是因爲你正在分裂字符中間的字節。你應該分裂角色。要做到這一點,你應該知道一個字符有多長。 – 2012-08-02 09:46:27

+0

你能幫我解決這個問題嗎? – 2012-08-02 09:49:05

1

下面是一個簡單的代碼可以做到這一點:

List<string> SplitString(String input, int length) 
{ 
    var splitedList = new List<string>(); 

    string block = ""; 
    var arabicBlock = ""; 

    foreach (char c in input) 
    { 
     if (block.Length + arabicBlock.Length > length - 1) 
     { 
      splitedList.Add(block); 
      block = ""; 
     } 

     var b = (int) c; 
     // check here if charachter is arabic 
     // this is a sample, or you can use 'IsArabicChar' 
     //if (b > 6000) 
     if(IsArabicChar(c)) 
     { 
      arabicBlock += c.ToString(); 
     } 
     else 
     { 
      block += arabicBlock + c; 
      arabicBlock = ""; 
     } 
    } 
    return splitedList; 
} 

IsArabicChar方法是有用的:

internal static bool IsArabicChar(Char character) 
{ 
    if (character >= 0x600 && character <= 0x6ff) 
     return true; 

    if (character >= 0x750 && character <= 0x77f) 
     return true; 

    if (character >= 0xfb50 && character <= 0xfc3f) 
     return true; 

    if (character >= 0xfe70 && character <= 0xfefc) 
     return true; 

    return false; 
}