我有一个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