web-dev-qa-db-ja.com

アラビア語と西洋文字を含む文字列の連結

アラビア語と西洋文字の両方を含む(同じ文字列に混在する)複数の文字列を連結しようとしています。問題は、結果が文字列であり、おそらく意味的には正しいが、文字の順序がUnicode双方向アルゴリズムによって変更されるため、取得したいものとは異なることです。基本的には、一部がRTLであり、一種の「不可知論的」連結であるという事実を無視して、それらがすべてLTRであるかのように連結したいと思います。

説明がはっきりしていたかどうかはわかりませんが、これ以上うまくいくとは思いません。

誰かが私を助けてくれることを願っています。

敬具、

カルロスフェレイラ

ところで、文字列はデータベースから取得されています。

[〜#〜]編集[〜#〜]

enter image description here

最初の2つの文字列は連結したい文字列で、3番目は結果です。

編集2

実際、連結された文字列は画像の文字列とは少し異なり、コピーと貼り付けの間に変更されました。1は最初のAの後であり、2番目のAの直前ではありません。

28
Carlos Ferreira

Unicode形式の制御コードポイントを使用してbidiリージョンを埋め込むことができます。

  • 左から右への埋め込み(U + 202A)
  • 右から左への埋め込み(U + 202B)
  • ポップ方向フォーマット(U + 202C)

したがって、Javaでは、アラビア語などのRTL言語を英語などのLTR言語に埋め込むには、次のようにします。

myEnglishString + "\u202B" + myArabicString + "\u202C" + moreEnglish

逆を行うには

myArabicString + "\u202A" + myEnglishString + "\u202C" + moreArabic

詳細については 双方向一般フォーマット を、ソース資料については 「方向フォーマットコード」に関するUnicode仕様の章 を参照してください。

45
Mike Samuel

文字列を正しく表示するには、Unicode方向フォーマットコードを文字列に挿入する必要がある可能性があります。詳細については、Unicode双方向アルゴリズム仕様の Directional Formatting Codes を参照してください。

たぶん Bidi クラスは、Unicode双方向アルゴリズムを実装しているので、正しいシーケンスを決定するのに役立ちます。

2
MicSim

コードポイントの順序は変わりません。何が起こっているのかというと、文字列を表示する場合、文字列が右から左へのスクリプトで始まっていることがわかるため、右から左へと表示されます。

1
MRAB