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 | ހެޔޮން، ކިހިންދީ؟ | ディベヒ語 |