LiveCode7 注:
LiveCode7 での開発は日本語も英文と同じ扱いができます。以下は参考としてください。日本語の保存はLiveCode 6が参考になります。その他特殊な状況の場合、バージョン6の日本語の扱いが活かせることもあります。


23: 日本語(ユニコード)の実践、その他

この章の概略
  • ユニコードは幾つかの点をきちんと押さえてスクリプトを書き進めれば、問題はいつも解決されます。その実践として、読点で区切られたデータを日本語テーブルにして、セルを他のデータに入れ替えます。
  • ユーザーの使っているメーラーから日本語のメールを送る書類を作成します。
  • Windowsの日本語配列のキーボードで起こる不具合を修正します。
  • 日本語のツール・チップをコントロールに作ります。
  • MacOS上で、日本語ファイル名の書類を保存します。
  • MacOS上で、日本語ファイル名の書類をインポートします。


日本語のテーブル・セルを差し替え

今までやってきた日本語(ユニコード)の扱いの応用です。
基本的な事を押さえておけば、対処できると言う例で作りました。重要な点は
1)テキスト・フィールドやボタンのレーベルの日本語表記では、ダブルバイトとシングルバイト・キャラクターを一緒にして使わない。
2)スクリプトを書いている時、今バリアブルではダブルバイトか、シングルバイトのキャラクターのどちらを扱っているのか、または文字コードは何なのかを、確実に把握しながら次の行を書いて行く。
3)バリアブル内で、ダブルバイトとシングルバイトのキャラクターを同時に扱うような場合、フィールドやボタンのレーベルに日本語を表示する前に、すべて統一したバイトのキャラクター、文字コードに戻す。

この3点に特に注意を払って書き進めて行けば、問題なく日本語の表記ができます。3)に関しては、ここで具体例を示します。

読点と改行で区切られた日本語のデータからテーブルを作って、そのセルの日本語を他の日本語と差し替えます。簡単なワイン・リストの日本語データを、フィールド「tData」に作ってください。

白、シャルドネ、マスカット、セミヨン
赤、カベルネ・ソーヴィニヨン、ピノ・ノワール、マルベック


テーブルの横のセルを区切るのは「tab」ですから、テーブルにするには日本語読点を「tab」にしなくてはいけません。テンポラリーのフィールド「tempo」を作って、日本語の読点だけを打ち込んだら、読点のUTF16のナンバーを、メッセージ・ボックスに書き出します。

get the unicodeText of fld "tempo" 
set the useUnicode to true
put charToNum(it)

ユニコードのナンバーは「12289」が書き出されます。スクリプトに直接日本語の読点を書き込めないので、日本語データの中のこのナンバーの文字を「tab」に差し替えてから、テーブル・フィールドに流し込みます。必要なフィールド、テーブル、ボタン等を図のように作ります。



一番上にフィールド「tData」を、その下にベーシック・テーブル・フィールド「jpTable」を作りました。テーブルはまだデータも何も入っていません。今はセルの横巾を設定するタブ・ストップ(tabStops)がデフォルトの「75」ですから、この図のようにはなっていりません。フィールド「tData」に、上にあるワイン・リストを書き込んでください。ボタン「テーブルに日本語をセット」のスクリプトは以下のようになります。

on mouseUp
   get the unicodeText of fld "tData" 
   set the useUnicode to true
   replace numToChar(12289) with uniencode(tab) in it
   put unicode it into fld "jpTable"
   set the tabstops of fld "jpTable" to 26,160
end mouseUp

始めにフィールド「tData」から、ユニコード・テキストで日本語文字列をゲットして「it」に入れます。ナンバーからユニコードのキャラクターに変換できるように、「the useUnicode」を「true」にします。スクリプト中で扱えるように、「it」に入っているユニコード・データの読点を「numToChar(12289)」として、ユニコードのタブ(uniencode(tab))と入れ替えます。それから通常のユニコードをテキスト・フィールドに入れる方法で、フィールド「jpTable」に「it」を入れ、タブストップを始めのコラムを26、2番目のコラムから160に広げます。ボタン「テーブルに日本語をセット」をクリックすると、テーブルは上の図のようになります。

フィールド「tReplace」には差し替える日本語を入れます。フィールド「tCell」はセルの位置、アイテム1は「コラム(column)」、アイテム2は「ロウ(row)」の数字を入れます。この例では、現在テーブルにある2段目の左から3番目「ピノ・ノワール」を「メルロー」に差し替えます。

スクリプトの中でラインやアイテムが扱えるのは、ANSI文字だけですから、テーブルの文字列をすべてユニコードで受け取って、ユニコードの「tab」や「cr = return」にあたるユニコード文字をANSI文字に差し替えて、ラインやアイテムを割り出します。バリアブル「tData」の文字を入れ替えたら、またタブと改行をもとのユニコードにして、テーブルに戻します。

on mouseUp
   put the unicodeText of fld "jpTable" into tData
   put the unicodeText of fld "tReplace" into tReplace  -- メルロー
   put item 1 of fld "tCell" into tColumn
   put item 2 of fld "tCell" into tRow
   replace uniEncode(tab) with tab in tData    -- タブをANSIに差し替え
   replace uniEncode(cr) with cr in tData      -- 改行をANSIに差し替え
   set the itemDel to tab
   put tReplace into item tColumn of line tRow of tData
   replace tab with uniEncode(tab) in tData    -- タブをユニコードに戻す
   replace cr with uniEncode(cr) in tData      -- 改行をユニコードに戻す
   put unicode tData into fld "jpTable"
end mouseUp

スクリプトの各ラインで扱っているキャラクターがユニコードかそうでないか、またはスクリプト中でミックスされてるキャラクターが何かを確実に把握しておけば、日本語の問題はほぼ解決されます。


日本語のアレイ

16章の英語のアレイをそのまま日本語には使えないので、日本語独自の方法が必要です。ここではスプリット「split」を使ったようなアレイを日本語で作ってみます。

まず英語のアレイを見てみましょう。

put "A,B,C" into myArray
split myArray by comma
put the keys of myArray



番号のキー(key)を使って、アレイ(array)からエレメント(element)が取り出せます。

put "A,B,C" into myArray
split myArray by comma
put myArray[1]

「A」が返されます。



ここまでがスプリット「split」を使った英語のアレイです。日本語(ユニコード)では、スプリット「split」を使ってアレイを作れないので、同じ内容をリピートでスクエアブラケットに数字(キー key)を入れたアレイに、ユニコード文字列( エレメント element)をひとつづつ入れて行く方法を取ります。16章の『アレイ「array」の基礎』の始めに説明があります。しかしユニコードは1つのキャラクターがダブルバイト文字なので、始めの文字から2文字づつ(2ステップ)区切り文字(この場合はカンマ)かどうかチェックしながら、アレイにエレメントを入れて行きます。ちょっと面倒ですが、スクリプを理解して書いてしまえば、後はすべてLiveCodeがやってくれます。下のデータをフィールド1(fld 1)に入れます。

トマト,たまねぎ,かぶ,ばれいしょ,ピーマン,山菜,さやえんどう,グリーンピース,
そらまめ,アスパラガス,こまつな,セロリー,にら,ふき,キャベツ	

データはと取り敢えずカンマ(comma)で区切りましたが、読点(、)でも他の文字でも可能です。このデータを「uncodeArray」と言うアレイにして「uncodeArray[5]」のように番号のキーでエレメントをフィールド2(fld 2)に書き出します。書き出すためのフィールド2(fld 2)を作ってください。

on mouseUp
   -- フィールドにある日本語データをバリアブル「tData」に入れます
   put the unicodeText of fld 1 into tData
   
   -- 「tData」のすべての文字数を「tLength」に入れます
   put the length of tData into tLength
   
   put 1 into tKey  -- 始めの番号のキーを作ります
   
   -- charToNum がユニコードで使えるようにします
   set the useUnicode to true  
   
   -- 「tData」の文字数だけ2ステップでリピート 
   repeat with i=1 to tLength step two 

      if charToNum(char i to i+1 of tData) is 44 or \
            charToNum(char i to i+1 of tData) is empty then
      -- もし2文字のユニコードの番号が「44(カンマ)」
      --   またはエンプティ(最後のエレメント)ならば
              
         put tElement into unicodeArray[tKey]   --アレイにエレメントを入れる
         add 1 to tKey     -- キーの番号を1上げる
         put empty into tElement     -- バリアブル「tElement」を空白に
         
      -- そうでなかったら
      else
         -- 2文字だけバリアブル「tElemnt」の後に付ける
         put char i to i+1 of tData after tElement
      end if   -- イフ構文終わり
      
   end repeat   -- リピート文終わり
   
   -- キー「5」の「nicodeArray」をフィールド2に書き出す
   put unicode unicodeArray[5] into fld 2
end mouseUp

この例文では「unicodeArray[5]」を書き出すようにしていますが、サンプル・スタックはカスタム・コマンド「createUnicodeArray」でアレイを作って、「the keys」のボタン・メニューからエレメントが引き出せるようにしています。

go to url "http://kenjikojima.com/livecode/download/unicodeArray.livecode"



日本語のメールを作る

ユーザーが使っているデフォルト・メーラーで新規メールを作って、宛先、件名、本文等をレボルーションから書き込む、「revMail」という英文の為のコマンドがあります。シンタックスは
	
revMail address, [ccAddress, [mailSubject, [messageBody]]]

具体的には、
	
revMail index@kenjikojima.com,  , "My LiveCode Mail", fld "messageBody"

となります。「ccAddress」は特になかったら、空白にしてカンマ(comma)だけで、次のメール・サブジェクトをつなぎます。最後は本文の描いてあるフィールドの名前です。短い文でしたらカンマで囲ったストリングを書く事もできます。これは英文の為のコマンドなので、日本語では文字化けになります。

日本語(ユニコード)のためには「revMailUnicode」と言うコマンドがあって、シンタックスもほとんど同じです。

revMailUnicode address, [ccAddress, \
         [unicodeMailSubject, [unicodeMessageBody]]]



件名と本文はユニコードにしなくてはいけませんが、宛先、Cc は必ず英文にします。「日本語メールを作る」に入るスクリプトは以下のようになります。

on mouseUp
   put fld "tAddress" into tAddress
   put fld "tCc" into tCc
   put the unicodeText of fld "tSubject" into tSubject
   put the unicodeText of fld "tBody" into tBody
   revMailUnicode tAddress,tCc,tSubject,tBody
end mouseUp

アドレス・フィールドと日本語配列のキーボードの問題を、この後に書きます。


日本語配列のキーボード

日本語配列のキーボードを使っていると、LiveCodeのテキスト・フィールドにキーボード通りの記号等が打ち込めないキーがあります。この問題の回避は非常に簡単で、日本語のフォントをフィールドに設定すれば解決できます。特に理由がない限り、MacOSでしたら「Osaka」、Windowsでしたら「Tahoma」が無難な選択でしょう。

注意しなければいけない点は、すべてのフィールドを、あらかじめ日本語ユニコードの書体、たとえば「osaka」にしていると、ユーザーがメールアドレスなどを打ち込んで、それをスクリプト内で使いたい場合は、必ず「unidecode(ユニコードの文字列,ANSI)」または「unidecode(ユニコードの文字列,Japanese)」に変換しないと、スクリプトは正しく働きません。

日本語以外のユニコードの言語に関しては、不明な点があるので、私の場合、多国語ユニコード対応のアプリケーションでは、文章を書き込むフィールドは、記号等の入力をしても、キーボード表示との違いが起きないユニコードの書体設定をして、Eメールアドレスを入力させるテキストボックに関しては、日本語配列キーボードのためだけの、強制変換をするようにしています。具体的には、日本語配列キーボードは、「P」の右隣をたたくと「@」が入力されなくてはいけないのですが、LiveCodeデフォルトのANSIIフィールドでは「[(左カギカッコ)」が、入力されてしまいます。これを「[(左カギカッコ)」が打ち込まれたら、直後に「@」に変えます。Eメールアドレスで使用できる記号は「@」だけですから、特にユーザーが気付くような大きなトラブルに はなりません。

Eメールアドレス用の、フィールド内に入れるスクリプトは以下の通りです。このフィールドの書体はデフォルトのままで、日本語ユニコードにはしません。

on returnInField 
   exit to top
end returnInField

on enterInField 
   exit to top
end enterInField

on keyUp pKey 
   if pKey is "[" then
      replace "[" with "@" in me
      get offset("@", me)
      select after char it of me 
   end if
end keyUp


日本語のツール・チップ

カード上にあるコントロールに、マウス・オーバーするとツールチップが現れるようにするには、プロパティ・インスペクターのツールチップ「Tool Tip」に表示させたい文を書き込みます。





しかし残念ながらプロパティ・インスペクターのツールチップに日本文を書き込むと、「?????????」になってしまいます。

スクリプトでボタン1(btn 1)に、英語のツールチップを書き込むには、

set the tooltip of btn 1 to "This is Tool tip."

日本語でツールチップを書き込むのは、英語のメール作成の時のバリエーションと非常に良く似ていて、「the tooltip」の変わりに「the unicodeTooltip」を使います。シンタックスは

set the unicodeTooltip of object to unicodeString

具体的に書いてみましょう。補助に日本語を書き込むフィールド「tempo」を作って、日本語を書き込みます。ボタン1(btn 1)に日本語のツールチップを書き込むスクリプトは、メッセージ・ボックスから送ります。

set the unicodeTooltip of btn 1 to the unicodeText of fld "tempo"




日本語ファイル名の書類を保存

LiveCodeの日本語の最大の問題は「日本語ファイル名」が扱えない事ですが、MacOSだけの開発でしたらアップル・スクリプトを応用する事で、問題は一部解決します。日本語をテキスト・フィールドから、日本語ファイル名にして保存する方法と、その日本語ファイル名の書類を、LiveCodeのフィールドにインポートする例をこれから書きます。

アップル・スクリプトを使うのは、コマンド「do」を使います。シンタックスは

do theAScript as applscript

イタリックの「theAScript」と書いた部分に、アップル・スクリプトのコードが入ります。日本語名のファイルで保存するアップル・スクリプトは下記のようになります。途中にファイルの中身の文章を書き込むので、2つのパート「cAScript1」と「cAScript2」に分けて、ボタンのカスタム・プロパティとします。

-- カスタム・プロパティ「cAScript1」としてボタンに保存
set newSaveFile to (choose file name with prompt 
  "Save As Japanese File Name:" as Unicode text default name 
     "Japanese File Name.txt" as Unicode text) 
-- ここまでは改行なしの1行で書き込む
put     -- この最後に1スペースのアキを取ってください。

put の後にクオートで囲った、保存する文章が来ます。さらにそのあと

-- カスタム・プロパティ「cAScript2」としてボタンに保存
-- 1行目の始めに1スペースのアキが必要です。
 into theText 
set fh  to open for access newSaveFile with write permission
try
write theText to fh starting at 0	
on error errMsg number ERRNO
close access fh
error "(" & ERRNO & ")" & errMsg 
end try
close access fh
tell application "Finder" to update newSaveFile 

カスタム・プロパティ「cAScript1」にある"Save As Japanese File Name:"と"Japanese File Name.txt"の部分は MacOS 10.6 までは、SJISで日本語に置き換えることができましたが、ユーザーのOSバージョンがわからないので英語で表記します。ファイル保存のダイアログは英語で表記されますが、ファイル名は日本語にすることが可能です。カードにフィールド「jpText」があるとして、その日本語を「SJIS」で保存するスクリプトを書きます。

on mouseUp
   put uniDecode(the unicodeText of fld "jpText", "Japanese") into tJp
   replace quote with "'" in tJp   -- ダブル・クオートをシングルに変換
   get the cAScript1 of me & quote & tJp & quote & the cAScript2 of me
   do it as applescript
end mouseUp

保存する日本語の中にあるダブル・クオートをそのままにしておくと、エラーになってアップルスクリプトが働きませんから、シングル・クオートに変換します。出て来るダイアログには日本語ファイル名を書き込む事ができます。


日本語ファイル名の書類をインポート

「日本語ファイル名の書類を保存」とは反対に、日本語ファイル名の書類をLiveCodeのフィールドにインポートします。上でSJISで保存したので、それがインポートできるようにしますが、UTF8でもUTF16でも同じアップル・スクリプトを使ってインポートできます。アップル・スクリプトの部分だけを下に書きます。

choose file with prompt ""
set openFile to result
try
read openFile
on error
close access openFile
display dialog "Error is occured."
return
end try

上記のアップルスクリプトをフィールド「tempo」に書き込んで、メッセージ・ボックスからボタン名「importJp」のカスタム・プロパティ「cAScript」にします。

set the cAScript of btn "importJp" to fld "tempo"

ボタン名「importJp」にカスタム・プロパティ「cAScript」を作ったら、中に以下のスクリプトを書き込みます。

on mouseUp
   do the cAScript of me as appleScript
   put the result into tSJISText
   put char 2 to -2 of tSJISText into tSJISText   -- クオートを取り除く
   if tSJISText contains numToChar(13) then \
         replace numToChar(13) with numToChar(10) in tSJISText
   put unicode uniencode(tSJISText,Japanese) into fld 1
end mouseUp

2行目の「the result」で受け取った文字列は、前後がクオートで囲まれていますから、3行目でそれを取り除きます。次の行では、もしWindowsで作られた書類だとすると改行は「crlf」が使われているので、MacOSでは改行以外にもう1行別なアキの行ができてしまいます。「crlf」の部分つまり「numToChar(13)」を、MacOSの「numToChar(10)」に変換すれば、通常のMacOSの書類の改行になります。





この章で新しく出て来た言葉

revMail

コマンド(command) ユーザーのメール・プログラムに新しい英文メールを作る

revMail index@kenjikojima.com, , "My LiveCode Mail", fld "messageBody"

revMailUnicode

コマンド(command) ユーザーのメール・プログラムに新しい日本語メールを作る

revMailUnicode tAddress,tCc,tUnicodeSubject,tUnicodeBody

keyUp

メッセージ(message) ユーザーがキーから指を上げた時に送られる

on keyUp pKey
    ステートメントがここに来ます。
end keyUp

unicodeTooltip

プロパティ(property)ユーザーがオブジェクトをマウスで指した時に出す説明文

set the unicodeTooltip of btn 1 to the unicodeText of fld "tempo"

do

コマンド(command) ステートメントを実行する

do tStatement as applescript




22: ボタン、メニューの日本語




ⓒ 小島健治 / Kenji Kojima