2

AS/400 の返信テキストは、以下に示すように多言語の文字列で、長さは 28872 文字です。

2012021920120219000000000300000D000000010146208D22ﻑﻳﺭﺎﺻﻣ

ブロックごとに 240 文字のテキストを分割する必要がありますが、間にアラビア文字があるため、ロジックが正確な 240 文字の長さを抽出できません。

私の質問は、元の形式を失わずに多言語テキストを分割する方法です。

4

2 に答える 2

4

テキスト エンコーディングに応じて、正確に 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.
于 2012-08-02T09:37:16.573 に答える
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;
}
于 2012-08-02T10:08:27.487 に答える