Default
Google

ヘブライ語に英語などの文字が入った場合の解決法についてです。

いつのまにか、元ネタの最新版が出たみたいです。縦書きの話が載っていました。ヘブライ文字、ローマ文字、数字は、回転も方向転換も(!)しなくて良いみたいです(Arabic Script, Arabic Glyphs, Roman Glyphsは回転が必要)。

双方向アルゴリズム

はじめに

ここでは、http://www.unicode.org/unicode/reports/tr9/tr9-4.htmlで示される双方向アルゴリズム(draft)をもとに、ヘブライ語における双方向表示方法を僕なりに解釈して明らかにしてみます。なるだけ、正確に書こうとは思ってますが、僕の誤解もあるかもしれませんので、鵜呑みにしないでね。

なお、ここで出てくる「現在の」という単語は、英語のcurrentのことであり、特に断らない限りnowという意味ではなありません。

背景

大雑把に説明したいので、曖昧な部分あるかもしれません・・・ いい表現方法が思い付いたら、適当に書き換えます。

ヘブライ語の特徴

表示に関連する部分としては、文字を「右から左」に書き(以下に出てくるright-to-leftとか、RTLなどはこれに起因します)記すところが特徴です。

ヘブライ語の処理

ここより、例は全て<samp></samp>でマークアップしています。

英語圏で発達してきたコンピュータの世界では、文字の表示順序は「左から右」に書き(以下に出てくるleft-to-right、LTRなどはこれに起因します)、ファイルに文字を収めるときも、例えばmineという単語の場合、m→i→n→eの順にするのが常識みたいなものです。

それからすると、文字の表示順序を「右から左」に書かなければならないヘブライ語は、かなり特殊だと言えます。ファイルに文字を収めるときも、例えばYvdLamedShyn という単語(訳:私の[もの])場合、ShynLamedYvdの順にするように、「左から右」に慣れた人にとっての見かけと逆になります。

単に順序が逆転しているだけなら、改行の位置に注意するだけで十分とは思うのですが、ヘブライ語では文中にアラビア数字(0〜9)、英語などの「左から右」な文字や文章を混ぜるときには、そこの部分は「左から右」に表記するので、そう簡単にいきません。例えば、
TethPe#VavSamekVavReyshQvfYvdMem  ThavReyshBeyth-eth  LamedShyn  Office 2000  He#TsadyqVavReysh  YvdNvn#alep
(訳:マイクロソフト社の Office 2000 が欲しい)と表示されている文章では、「実際に書く and/or 発音する and/or 頭の中」における順序(以下、論理的な順序とする)、乃至はファイル中では
#alepNvnYvd→  →ReyshVavTsadyqHe#→  →O→f→f→i→c→e→ →2→0→0→0→0→  →ShynLamed→  →-ethBeythReyshThav→  →MemYvdQvfReyshVavSamekVavPe#Teth

になります。この例では、論理的な順序に関わらず、表示する順序(以下、物理的な順序とする)は、Office 2000の部分だけが「左から右」にしているのがわかると思います。

この例だと、Officeのeと2000の2までに挟まるスペースを一塊として考えればよさそうです。でも、記号が入ってくると、どこから「左から右」(以下、LTR)で、どこまでが「右から左」(以下、RTL)なのか、簡単にはわからないような気がします。

そこで、僕としては、特に記号が入った場合をどのように解決するか、ということに興味があるので、ちんたらとですが、調べています。このページはその結果です。

補足

とはいえweb上ではiso-8859-8(ISO-VISUAL)と呼ばれる物理的な表記法が存在し、それはVISUALの名の通り、コンピュータの世界の常識での見たままにファイルに収めています。今のところ、ヘブライ語のサイトでは優勢みたいです。それでも最近はiso-8859-8-i(ISO-LOGICAL)とかwindows-1255と呼ばれる(暗示的である)論理的な表記法が、数年前に比べたら増えてきています。あと、あまり見かけていませんが、iso-8859-8-eと呼ばれる明示的である論理的な表記法があり、それは特殊な記号を、明示的に文中に埋め込むことにより、文章の方向を示す方法です。ただ、Bidirectionality and character encodingで示されるように、使わない方が良いそうです。

蛇足

以前、RFC1556を見たときに、完璧なアルゴリズムは本当に複雑と書かれてあって、アルゴリズム自体が見当たらなかったので、がっかりしたことがありました・・・

本論

問題点

上記でも書いた部分も含め、ヘブライ語の文章が論理的に表現されている場合、物理的に表現するとき生じる問題点をまとめます。裏をかえせば、物理的に表示されている文章を論理的に書くことの問題にもなるんじゃないかな、と予想しながら書いてます。

  1. 英語などのLTRの埋め込み
  2. 記号の埋め込み
  3. 入れ子に埋め込まれている場合

前提

ここでは、ヘブライ語と英語や記号等の混在のみを考えますので、他の言語、特にアラビア語のように、ヘブライ語とは微妙にRTLのアルゴリズムが異なる言語は、ここでは考えないことにします。良く知らないいので、書きようがない、ということです。

以下の例において、大文字はヘブライ文字、小文字は英語で書かれているとして考えてください。また、論理/物理は表現方式を、方向は、文字の方向を示します。

更に、N1とかW8のようにアルファベット+数字で構成されている個所は、http://www.unicode.org/unicode/reports/tr9/tr9-4.htmlの該当項目を示していますので、参考にしてください。

凡例を以下に示します。
R:RTL
L:LTR
E:EN
S:ES/CS
N:N
?:例の時点では不明なもの

LTRの埋め込み

まず、例を示します。

論理:GET note MINE
方向:RRR?LLLL?RRRR
    ↓
方向:RRR?LLLL?RRRR
物理:ENIM note TEG

RLT中に、noteのみがLTRになっていることがわかると思います。ただ、RTLとLTRの間にあるスペースの方向は、説明の都合上、とりあえず不明にしておきます。

記号の埋め込み

以下に例を示します。

論理:THIS IS new note FOR YOU
方向:RRRRRRRRLLLLLLLLRRRRRRRR
    ↓
方向:RRRRRRRRLLLLLLLLRRRRRRRR
物理:UOY ROF new note SI SIHT

RTLに囲まれているスペースはRTLに、LTRに囲まれているスペースはLTRになっている(N1)ことがわかると思います。この例ではヘブライ語に英語を埋め込んでいるので、RTLとLTRの間にあるスペースの方向がRTLになります(N2)。このように、周りの環境によって方向が変わる文字は中立文字と呼ばれ、スペースのほかに一部の記号も含まれます。

この他、文字の種類として、ヘブライ文字やローマ字のような普通の文字は強文字、括弧や句読点等の記号は弱文字と呼ばれ、それぞれ複数存在します。

ここで、強文字の処理は、例えばヘブライ文字ならRTL、ローマ字ならLTRにすれば良いので、基本的に簡単ですし、中立文字も基本的には先に述べたように処理をすればいいのですが、弱文字の処理は、かなり複雑になります。なぜなら、後で述べますように、弱文字は、処理の過程で強文字または中立文字とみなし、それから処理を行うからです。

欧数字

以下に例を示します。いきなり複雑ですが・・・

論理:THAT 90 IS 56 78 WRITTEN IN 12 notes named 34 OF ME
方向:RRRRRLLRRRRLLRLLRRRRRRRRRRRRLLRLLLLLLLLLLLLLLRRRRRR
    ↓
方向:RRRRRRLLLLLLLLLLLLLLRLLRRRRRRRRRRRRLLRLLRRRRLLRRRRR
物理:EM FO notes named 34 12 NI NETTIRW 78 56 SI 90 TAHT

この例では、欧数字(EN)の処理に注目してください。90は左右が同じ方向なのでLTRの埋め込みと同様に処理します。56と78は左右が同じ方向ですが、間に中立文字が含まれているので、表示の順序が逆になります。12と34は左右が異なる方向なので、左右の空白文字の扱いが複雑になります。

  1. まず、ENのある部分から、強文字が出てくるまで前方向に戻ります。この例では、90はTHATのT、56と78は共にISのS、12ではINのN、34ではnamedのdまでになります。
  2. 戻った先がLTRなら、そのENをLTRにします。RTLなら、そのENをENのままにします。(この行全てW8)
  3. その後、中立文字がLTRに挟まれているのであれば、それもLTRにします。RTLとENに挟まれているのであれば、それはRTLにします。RTLに挟まれているのであればRTLにします。(この行全てN1)
  4. 次に、残った中立文字は、現在の埋め込みレベルにあわせます(N2)。この例では、56と78の間、12とnotesの間、34とOFの間のスペースがそれぞれ該当し、それらはRTLに埋め込まれているので、RTLになります。
  5. 最後に、残ったENはLTRにします(RTLに埋め込まれているのでI2を適用、但し厳密にはもう少し複雑)。

欧数字分離記号/共通数字分離記号

以下に例を示します。

論理:THAT 1,012 MEANS 512, 500
方向:RRRRRLLLLLRRRRRRRLLLRRLLL
    ↓
方向:LLLRRLLLRRRRRRRLLLLLRRRRR
物理:500 ,512 SNAEM 1,012 TAHT

この例では、欧数字(EN)に囲まれた共通数字分離記号(CS)の処理に注目してください。

「,」の左右がともにENなのでENとみなし、LTRになります(W4)。

しかし、512と500の間の「,」は、片側がENではないので、中立文字と同じ扱いになり(W6)、この例ではRTLに埋め込まれているので、RTLになります。

これらの処理は、欧数字分離記号(ES)でも同じようになります。

欧数字終了記号

括弧

入れ子に埋め込まれている場合

付表

文字の定義一覧(抜粋、要約)
Category Type Description Scope
強文字 L Left-to-Right 数字以外の、大抵の文字(アルファベット、漢字)など
R Right-to-Left ヘブライ文字
弱文字 EN 欧数字 数字など
ES 欧数字分離記号 Non-breaking Space
ET 欧数字終了記号 プラス、マイナス、度、通貨記号など
CS 共通数字分離記号 Colon, Comma, Full Stop (Period), Solidus (Slash), ...
NSM Non-Spacing Mark Characters marked Mn (Non-Spacing Mark) and Me (Enclosing Mark) in the Unicode Character Database.
中立文字 B 段落分離文字 段落を分離する文字で、適切な新しい行を追加したり、もっと上位の段落を決めます。
S 区切り文字 タブ
WS 空白文字 スペース、改行しないスペース、行の分離文字、一般的な句読記号としてのスペース、等
ON その他の中立文字 OBJECT REPLACEMENT CHARACTERを含む、その他の全ての文字
内部形式
Symbol Description
N Neutral or Separator (B, S, WS, ON)
e The text ordering type (L or R) that matches the embedding level direction (even or odd)
SOP Start of paragraph. Treated as e.
EOP End of paragraph. Treated as e.

ホームページ



Acquiring image from ProHosting Banner Exchange