首页 > 解决方案 > 了解ICU ubidi。方向始终是 UBIDI_LTR

问题描述

我写了一段引用 ICU 参考的示例代码,从文件中读取一行并获取它的基本方向并查看 Unicode Bidi 算法的结果。

在我的输入文件中,我写了فارسی ,这是一个从右到左的字符序列。但这一行 std::cout << ubidi_getBaseDirection(us.getBuffer(), us.length()) << std::endl;打印 0 即UBIDI_LTR。而且无论我在输入文件中给出什么字符组合(RTL 和 LTR 组合),它总是会以 UBIDI_LTR 方向运行一次。

我的代码有问题吗?

#include "unicode/utypes.h"
#include "unicode/uchar.h"
#include "unicode/localpointer.h"
#include "unicode/ubidi.h"
#include <unicode/unistr.h>
#include<string>
#include<iostream>
#include <fstream>
#include "unicode/ustream.h"


using namespace icu;
using icu::UnicodeString;

int main(int argc, char* argv[])
{
    std::string input;
    std::string output;

    std::ifstream MyReadFile("in.txt");
    getline(MyReadFile, input);


    UnicodeString us(input.c_str());
    UBiDi* bidi = ubidi_open();
    UErrorCode errorCode = U_ZERO_ERROR;
    ubidi_setPara(bidi, us.getBuffer(), us.length(), UBIDI_RTL, nullptr, &errorCode);

    std::cout << (ubidi_getBaseDirection(us.getBuffer(), us.length()) == UBIDI_LTR) << std::endl;

    std::ofstream MyFile;
    MyFile.open("out.txt");

    if (U_SUCCESS(errorCode))
    {
        UnicodeString Ustring(ubidi_getText(bidi));
        std::string Ustr;
        Ustring.toUTF8String(Ustr);
        int32_t count = ubidi_countRuns(bidi, &errorCode);
        int32_t logicalStart, length;

        if (count > 0)
            MyFile << "VisualRun \t" << "direction" << "\t" << "s" << '\t' << "l" << '\t' << "output" << std::endl;

        for (int32_t i = 0; i < count; i++) {

            UBiDiDirection dir = ubidi_getVisualRun(bidi, i, &logicalStart, &length);
            std::string dirstr = "UBIDI_LTR";
            if (dir == UBIDI_RTL)
                dirstr = "UBIDI_RTL";

            UnicodeString temp = Ustring.tempSubString(logicalStart, length);

            char* dest = (char*)malloc(temp.length());
            temp.extract(logicalStart, length, dest, strlen(dest));

            output = std::string(dest);

            MyFile << "VisualRun \t" << dirstr << "\t" << logicalStart << '\t' << length << '\t' << output << std::endl;

        }
    }
    else
    {
        std::cout << "Failed" << std::endl;
    }
    MyFile.close();


    return 0;
}

标签: c++icubidi

解决方案


推荐阅读