我有一個AS/400回覆文本,它帶有多語言字符串,如下所示,長度爲28872個字符。拆分多語言字符串
2012021920120219000000000300000D000000010146208D22فيراصم
我不得不分割文本每塊240個字符,但如我在我的之間邏輯未能提取確切240字符長度阿拉伯字符。
我的問題是如何拆分多語言文本與失去原始格式?
我有一個AS/400回覆文本,它帶有多語言字符串,如下所示,長度爲28872個字符。拆分多語言字符串
2012021920120219000000000300000D000000010146208D22فيراصم
我不得不分割文本每塊240個字符,但如我在我的之間邏輯未能提取確切240字符長度阿拉伯字符。
我的問題是如何拆分多語言文本與失去原始格式?
你應該編寫你的代碼,它取決於文本編碼,提取完全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.
下面是一個簡單的代碼可以做到這一點:
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;
}
我擁有的文本是UTF-8格式。當我把它分成每個240個字符時,這些值被錯誤放置。我認爲阿拉伯語與此有關.. – 2012-08-02 09:44:51
但那是因爲你正在分裂字符中間的字節。你應該分裂角色。要做到這一點,你應該知道一個字符有多長。 – 2012-08-02 09:46:27
你能幫我解決這個問題嗎? – 2012-08-02 09:49:05