c++ - 了解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;
}
解决方案
推荐阅读
- strapi - 如何向 Strapi 中的内容类型添加非用户可编辑的字段?
- api - 是否可以统一使用Java编译器?
- keras - LSTM 模型未实例化
- azerothcore - 如何设置一周中的一天来重置英雄实例?
- java - 如何在 Dager 2 中创建包含 DAO 对象的 ViewModel?
- powershell - 如何删除花括号并在 csv 文件中获得正确的输出
- arrays - 制作结构 JSON 模式
- google-apps-script - 通过 Apps 脚本添加的 Google 联系人无法按预期工作
- laravel - 如何在 ionic 3 中发布关联数组
- c++ - 视觉小说开发 - 我应该一次加载所有语音和图像资产吗?