2

我有一个 AS/400 回复文本,它带有如下所示的多语言字符串,长度为 28872 个字符。

2012021920120219000000000300000D000000010146208D22ﻑﻳﺭﺎﺻﻣ

我必须将文本拆分为每个块 240 个字符,但由于在我的逻辑之间有阿拉伯字符,因此无法提取确切的 240 个字符长度。

我的问题是如何在不丢失原始格式的情况下拆分多语言文本?

4

2 回答 2

4

您应该这样编写代码,根据文本编码,它可以准确提取 240 个字符。一个字符可以占用几个字节,具体取决于编码。常见的编码是UTF-8. 查看 Wikipedia,了解 UTF-8 的工作原理。这将允许您编写正确的工作代码。UTF-8 说明

因此,您应该找出当前字符占用了多少字节。

当然,在开始之前,请确保您知道输入文本的编码。


知道 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.
于 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 回答