タイ語の合体文字をプリンタで出力したい
いつもお世話になっております。
自分はAndroidアプリの多国籍対応を行っています。
この度、初めてタイ国(タイ語)にアプリのリソースを対応することになったのですが、
モバイルプリンタによる印刷機能の移植で、「タイ語の合体文字がばらばらに出力される」という
大きな壁にぶつかったため、アドバイスをいただきたく質問させていただきました。
釈迦に説法ではございますが、タイ語についてまず自分の認識を確認させてください。
タイ語は音節文字の一つであり、真ん中に大きく置かれた子音文字の左右上下に
母音文字や音節記号をデコレーションすることで一文字(音素)が構成されている...そうです。
見た目は非常に美しい文字ではございますが(タイ国に大分感化されております)、
Androidの標準的なエンコードであるutf-8やutf-16beでタイ語を記した場合、ひとつの音素が複数の母音記号および子音字の組み合わせからなる場合には,クメール文字の場合と違って独立したコードを与えられていないため、見た目が一文字でも、length()を取ると時として2~8文字としてカウントされるvalidation泣かせな文字でもあります。
さて、上記特徴を持つタイ語を印刷したい場合、モバイルプリンタによっては上手く出力されるとは限りません。
タイ語のフォント(コードページ)にプリンタ機が対応していることは前提として、プリンタ機のファームウェアの中にはタイ語の子音文字と母音文字の組み合わせを理解しない、言わばタイ語のパーサーを持たない機種があるからです。
自分の会社が採用した端末は、タイ語のフォント(コードページ)に辛うじて対応している廉価機種だったため、プリンタ機のコマンドに流すために単純に文字列のエンコードをutf-8からISO-8859-11(タイ語のISO規格。ベースはユニコードと同じTIS620)にバイナリ変換すると合体文字がばらばらになって出力されます。
タイ語で例を出しても自分も分からないので、日本語でばらばらな雰囲気をお伝えします。
オリジナルテキスト→バイナリ変換結果
神
→ネ申
数
→女米攵
タイ語のユニコードは、合体文字を一文字と解釈して表示するために規則があります。左下中上上右と頭の片隅で十字キーを入力すれば簡単に覚えられるかと老爺心ながら助言します。
メーカーさんに問い合わせたところ、採用予定のモバイルプリンタ機は3-pass
機種であり、ユニコードをそのまま解釈できる1-pass
機種ではないとのこと。丁寧な図解とともに説明が送られてきましたが、斜め読みすると子音文字の上下につける母音文字、声調記号は、別のラインで印刷する必要があるよ、ただし位置合わせはそっち(プリンタ機にコマンドを送るクライアント側)で頑張ってね
の一言で終わってました。3-pass
とは、3行で印字するという意味だったのです。ESC/Pコマンドを作ったEPSONさんあたりが言い出したのでしょうけど、ぶっちゃけタイ語に対応しているって言わないですよね、それ...
Q. あ゛あ゛あああ゛あ゛と叫ぼうとしても、ああああああ゛゛゛゛とばらばらになります。
どうすれば、印刷できますか?A. プリンタ機は3-pass対応機です。
したがって、句読点を調整するコマンドを別途加味してください。
- 合体文字を一文字ずつ切り出して「あ」と「゛」の対応表を作成してください。「あ」と「゛」のバイナリコマンド>はそれぞれ、「0x0A」「0x0B」です。
→0A0B0A0A0B0A0A0A0B0A0B- 「あ」と「゛」はそれぞれ別の行に出力します。「あ」の上に「゛」がくるように調整してください。
印字間隔はスペースコマンド「0x20」を文字数分入れて、調整してください。
→0B0B20200B0B
→0A0A0A0A0A0A- プロポーショナルフォントを使用したい場合、横幅が文字によって異なります。
「あ」の上の「゛」がずれて表示されることがあるので、印字開始位置をドット単位で調整してください。
→ 0B0B20200B0B
→0A0A0A0A0A0A- 母音文字は子音文字より小さいです。普通に改行すると文字が離れすぎるため、
行間を紙送り量をmm単位で調整してください。
→ 0B0B20200B0B1b02
→0A0A0A0A0A0A1b10
自分はこの辺でさじを投げました。
(ラインプリンタとページプリンタを意図して混同してます。悪しからず...)
前置きが長文となってしまい、申し訳ございません。
それでは掲題について、もう一度質問致します。
タイ語の合体文字を*3-pass*のプリンタで出力したい。
そのために、合体文字を上中下に合わせていい感じに3行に分解してくれる
java
のライブラリを探しております。
Androidアプリで使用するため、軽量であればなお幸いです。
皆様のお力をお借りしたく存じます。
以上、よろしくお願いいたします。
参考までに、Oracle
さんのSolaris
には、まさに上記にありますプリンタ出力時に1-pass
から3-pass
へ変換するためのコマンド: thaifilter(1)
があったそうです。Legacyゆえ、オミットされてしまったそうですが...