スポンサーリンク

icuでテキストの方向を特定

ubidiでテキストが左から右か、右から左か判定する。

#include <iostream>
#include <unicode/ubidi.h>
#include <unicode/unistr.h>
#include <unicode/utypes.h>

#if defined(_DEBUG)
#pragma comment(lib, "icuucd.lib")
#else
#pragma comment(lib, "icuuc.lib")
#endif

// SetConsoleOutputCP
#include <windows.h>

#include <codecvt>

bool isRTL(const std::u16string& text) {
    UErrorCode errorCode = U_ZERO_ERROR;

    const char16_t* buffer16 = reinterpret_cast<const char16_t*>(text.c_str());
    size_t buffer_length = text.length();

    // UBiDi オブジェクトを作成
    UBiDi* bidi = ubidi_openSized(buffer_length, 0, &errorCode);

    // テキストの方向性を解析
    ubidi_setPara(bidi, buffer16, buffer_length, UBIDI_DEFAULT_LTR, nullptr, &errorCode);
    if (U_FAILURE(errorCode)) {
        ubidi_close(bidi);
        return false;
    }

    // 方向を取得
    UBiDiDirection direction = ubidi_getDirection(bidi);

    // UBiDi オブジェクトを解放
    ubidi_close(bidi);

    // RTL なら true, LTR なら false
    return direction == UBIDI_RTL;

}

int main() {
    SetConsoleOutputCP(CP_UTF8); // コンソール出力にUTF8を指定

    std::u16string text[] = {
        u"Hello, how are you?",  // 英語(左から右)
        u"こんにちは、お元気ですか?",  // 日本語(左から右)
        u"안녕하세요, 어떻게 지내세요?",  // 韓国語(左から右)
        u"مرحباً، كيف حالك؟",  // アラビア語(右から左)
        u"שלום, מה שלומך",     // ヘブライ語(右から左)
        u"ܫܠܡܐ ܐܝܟ ܐܢܬܐ",      // シリア語(右から左)
        u"ހެޔޮން، ކިހިންދީ؟"         // ディベヒ語(右から左)
    };
    for(auto& t : text) {
        if (isRTL(t)) {
            std::cout << " RTL ";

            // u16string を UTF-8 に変換
            std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> converter;
            std::string utf8str = converter.to_bytes(t);
            std::cout << utf8str << std::endl;
        }
        else {
            std::cout << " LTR ";

            // u16string を UTF-8 に変換
            std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> converter;
            std::string utf8str = converter.to_bytes(t);
            std::cout << utf8str << std::endl;
        }
    }

    return 0;
}
方向 例文 言語
LTR Hello, how are you? 英語
LTR こんにちは、お元気ですか? 日本語
LTR 안녕하세요, 어떻게 지내세요? 韓国語
RTL مرحباً، كيف حالك؟ アラビア語
RTL שלום, מה שלומך ヘブライ語
RTL ܫܠܡܐ ܐܝܟ ܐܢܬܐ シリア語
RTL ހެޔޮން، ކިހިންދީ؟ ディベヒ語

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: