AS/400 の返信テキストは、以下に示すように多言語の文字列で、長さは 28872 文字です。
2012021920120219000000000300000D000000010146208D22ﻑﻳﺭﺎﺻﻣ
ブロックごとに 240 文字のテキストを分割する必要がありますが、間にアラビア文字があるため、ロジックが正確な 240 文字の長さを抽出できません。
私の質問は、元の形式を失わずに多言語テキストを分割する方法です。
テキスト エンコーディングに応じて、正確に 240 文字を抽出するようにコードを記述する必要があります。エンコーディングによっては、文字が数バイトかかる場合があります。一般的なエンコーディングはUTF-8
. UTF-8 の仕組みについては Wikipedia を参照してください。これにより、正しい作業コードを書くことができます。UTF-8 の説明
したがって、現在の文字が何バイトかかるかを調べる必要があります。
もちろん、開始する前に、入力テキストのエンコーディングを確認してください。
Java は UTF-16 を使用して文字を格納することを知っておいてください。char
したがって、これは、コード ポイントが 2^16 を超えるため、1 つのアラビア文字を複数の から作成できることを意味します。これを正しく処理するには、文字列全体をバイト バッファーに変換します。
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;
}