LiveCode7 注:
LiveCode7 での開発は、テキスト・フィールド内の文字やオブジェクト名などの日本語も英文と同じ扱いができます。日本語の保存や文字コードの変換はLiveCode 6と同じです。その他特殊な状況の場合、このバージョン6チュートリアルの日本語の扱いが活かせることもあります。


20:日本語(ユニコード)の基礎

この章の概略
  • フィールド間で日本語テキストを移動させる。
  • ボタンのレイベルやスタックのタイトルに日本語を設定します。
  • フォントの違いから言語を分類して、フィールドの日本語をフォント別に設定します。
  • インターネットにある日本語をテキスト・フィールドにインポート。
  • 他のユニコード・フォーマットから、LiveCodeで使うユニコードに変換。


このチュートリアルを書き始めた時に第二部は、Revolution2.7で書いた「革命日本語入門」を手直しする程度の事を考えていましたが、それだけでは収まりきらない事や、新たなバグ等の修正スクリプトが必要な事が判明し、すべて書き直しています。


フィールドからフィールドに文字列を移動

始めに英語でやってみます。ニュー・メインスタックを作って、テキスト・フィールドを2つツール・パレットから作ります。上に置いたフィールドの名前(name)は「en1」、下のフィールドは「en2」にします。フィールド「en1」に「Hello」とタイプして



「English」と言うレイベル(lable)のボタンを作って、中のスクリプトは

on mouseUp
   put fld "en1" into fld "en2"
end mouseUp

として、ボタンをクリックするとフィールド「en2」に「Hello」と文字列が入ります。それでは日本語をやってみます。同じようにフィールドを2つ、名前を「jp1」と「jp2」にします。ボタンは名前(name)を「jp」、レイベル(label)を「日本語」にしてください。



これで英語と同じように

on mouseUp
   put fld "jp1" into fld "jp2"
end mouseUp

と送ると「?????」がフィールドに入ります。日本語では「put ... into 」は使えません。 今「日本語」と書いていますが、LiveCodeでは日本語だけでなく、普通の英数字以外の文字を使う国の言葉は、すべてUnicode(ユニコード)と言う文字コードを使います。別な言い方をすると、ユニコードに対応したスクリプトにしておけば、中国語でも、韓国語でも、ロシア語でも、何語でも対応可能と言う事になります。とは言っても、私たちのよく知らない歴史的な経過で、何種類かのユニコードというのがあって、LiveCodeのユニコードの表示は「UTF-16」と言うユニコードを使います。インターネットでは「UTF-8」と言うユニコードがポピュラーなでの、「UTF-8」から「UTF-16」の変換や、その逆の「UTF-16」から「UTF-8」の変換も、この第二部で扱います。もうひとつ日本語では「SJIS」と言う文字コードもポピュラーですから、その変換についても書いて行きます(SJISはユニコードではありません)。

英語のようにASCIIの256文字以内で扱える文字コードを「シングルバイト言語(1バイト)」と言い、それに対して日本語のよう言語を「ダブルバイト言語(2バイト)」と言っています。LiveCodeのスクリプトは、「シングルバイト」でのみ書く事ができます。LiveCodeのスクリプトは、ダブルバイト言語とミックスするとトラブルになりますから、それを避ける方法についても書いて行きます。

 ASCIIについては10章、12章に説明があります。




「put」はフィールド、「set」はそれ以外

それでは続きをやりましょう。バージョン5.5からLiveCodeに加えられた言い回しの

put unicode ユニコードにした文字列 into fld フィールド名

から説明します。これは文章の取り扱いに「put」を使う、ハイパートークからの流れに沿った言い回しで、それ以前のLiveCodeのユニコードの扱いは、すべて「set」を使っていました。「put unicode 」を使う場合は、フィールドの文字列に限られます。それ以外のオブジェクトに日本語(ユニコード)を表示させたい場合は「set」を使います。今まで使っていた「set」は、引き続きフィールドでも使う事はできます。現段階では「put」を使うのはフィールド、その他は「set」と分けて考えた方が良いと思われます。「set」を使う方法は、バイナリーのイメージ・データを、イメージ・オブジェクトにセットしたのと少し似ています。実際ファイルを保存する場合など、LiveCodeではユニコードをバイナリーデータとして取り扱います。

「put」を使う具体的な方法について書きます。フィールド内にある文字列を、「ユニコードにした文字列」とするのには「the unicodeText of fld フィールド名」を使います。

put unicode the unicodeText of fld "jp1" into fld "jp2"

 フィールド「jp1」のユニコード・テキストをフィールド「jp2」にプット(put)しなさい

これで「put」を使って、日本語文字を他のフィールドに移し替える事ができます。

では「set」を使ってやってみます。日本語の入っているフィールドも、これから日本語を入れるフィールドも「the unicodeText of fld フィールド名」にして、ターゲットのフィールドに「set」します。

set the unicodeText of fld "jp2" to the unicodeText of fld "jp1"

 ユニコードテキストのフィールド「jp2」をユニコードテキストのフィールド「jp1」に設定しなさい。

これでこちらも、フィールド「jp2」に「こんにちは」が入ります。
フィールド「jp1」をユニコードにしないで、普通のテキストの意味「fld "jp1"」にすると

set the unicodeText of fld "jp2" to fld "jp1"

何だか分からない漢字の文字化けになってしまいます。英語に比べると「put」も「set」も、ちょっとだけ面倒ですね。とにかくこれがユニコードを扱う最も基本の形です。どちらもユニコードにした文字列で扱わないと、きちんと表示されません。「put」はユニコード・テキストの文字列をフィールドにプット(put)します。「set」はユニコード・テキストの文字列を、ユニコード・テキストを受けられる形にしたオブジェクト(フィールドに限りません)に、セット(set)すると覚えてください。


ボタンのレイベルをスクリプトで日本語に

上に書いたユニコードを扱う基本の形のバリエーションで、ボタン名「jp」のレイベルを日本語表記にスクリプトでしてみます。今度はメッセージ・ボックスから送ってください。

set the unicodeLabel of btn "jp" to the unicodeText of fld "jp1"

 ボタン名「jp」のユニコードのレイベルを、ユニコードテキストのフィールド「jp1」に設定しなさい。

これでボタン「jp」のレイベルも「こんにちは」になりました。ほとんどの場合「the unicodeLabel of btn ボタン名」を使わないで、英語と同じように「the label of btn ボタン名」でも、日本語レイベルをセットできますが、「上」や「伊」などのユニコードUTF16の中の一部の文字が、トラブルを起こすことがあって、日本語のボタン表示をする場合は、「the unicodeLable of」を使ってください。ユニコードUTF16の中の一部の文字のトラブルは、後の章で説明する予定です。

ユニコードを扱っていると、ちょっとしたスペル・ミスや文法の間違いで、文字化けが起こる事があります。場合によっては、LiveCodeがフリーズしたりするかもしれません。フリーズしたら、Macなら、アップル・メニューから「強制終了...」で、Windowsなら「タスク・マネージャー」でLiveCodeを終了させてください。


ランゲージからフォントを分類

LiveCode7 注: LiveCode 7では「the fontLanguage」での言語分類は使えません。LiveCode 7のフォント名は全てアルファベット表記です。

ユニコードを扱うマナーに従わない設定が、文字化けを引き起こして場合によったらフリーズする事もありますが、他の原因に適切なフォントに設定されていないと言う場合もあります。スクローリング・フィールド(scrolling field)をカード上に作って、メッセージボックスから

put the fontNames into fld 1

を送ると、すべてのフォントのリストがフィールドに入れられます。しかしいろいろな処で文字化けを起こしているのが見られます。「put unicode ユニコードの文字列 into fld フィールド名」で、ユニコードに変換してやってみます。しかし フィールドに入っている文字列なら「the unicodeText of fld "フィールド名」と言う形でユニコードを取り出せますが、「the fontNames」のような文字列をユニコードにするには、「uniEncode(文字列)」を使います。それではこれで、メッセージボックスから送ってみます。「uniEncode」を使わないと、フリーズする可能性がありますから注意!

put unicode uniencode(the fontNames) into fld 1

これでも、やっぱり同じように文字化けしています。では「set」を使ってみます。

set the unicodeText of fld 1 to uniEncode(the fontNames)



一応マナー通りの設定をしたのですが、まだ文字化けしています。このザ・フォント・ネーム(the fontNames)はいくつもの言語の文字が入っているので、それに見合ったフォントに設定しないと、英語の文字しか正しく表示されません。MacOSでは「Lucinda Grande」が、Windowsでは「Segoe UI」がデフォルトでフィールドのフォントに、デフォルトで設定されているので、MacOSだったら「Osaka」に、Windowsだったら「Tahoma」をテキスト・フィールドに設定すれば、英語と日本語が読める文字になります。

set the texFont Of fld 1 to "Osaka"   -- Mac OS

set the texFont Of fld 1 to "Tahoma"   -- Windows



これほぼ文字化けはなくなりましたが、まだいくつか文字化けの行があります(日本語、英語フォント以外入れてない場合は、文字化けはありません)。このフォント・ネーム(the fontNames)で得られるも文字列は、それぞれの行がランゲージのインフォメーションを含んでいるので、日本語や英語は「Osaka(MacOS)」や「Tahoma(Windows)」では文字化けは起こさないでも、韓国語や、タイ語や、トルコ語などがリストに入っているとその行は文字化けになります。

put the fontLanguage of fld 1

と、メッセージ・ボックスから送ると、MacOS(Osaka)もWindows(Tahoma)も「Japanese」を返します。日本語か英語を使っている人達のコンピュータでは、フォント・ネーム(fontNames)は「ANSI(English fonts)」か「Japanese」を返しますが、他のランゲージが入っていると、それぞれ別なランゲージ名を返します。ほとんど使う事もない言語もあるかもしれませんが、「the fontLanguage」は以下の言語が返されます。と言う事は、以下の言語をLiveCodeではユニコードで扱う事ができます。

ANSI (English と同じに使われます)
Arabic
Bulgarian
Chinese
Greek
Hebrew
Japanese
Korean
Polish
Roman
Russian
Thai
Turkish
SimpleChinese
Ukrainian



スタックに日本語タイトル。
日本語フォントでテキストをセットする

フォント・ランゲージ(fontLanguage)で日本語フォントだけを選び出して、日本語テキストを、それぞれのフォントにセットしてみます。作っているスタックを「fontLanguage.livecode」と言うファイル名で保存してください。日本語でスタックのタイトルを付けます。スタックの何処かにフィールドを作って名前(name)を「jpTilte」としてメッセージ・ボックスから

set the unicodeTitle of this stack to the unicodeText of fld "jpTitle"

 このスタッックのユニコード・タイトルを、    フィールド「jpTitle」のユニコードテキストにセットしなさい。



ここで日本語タイトルのために使ったフィールド「jpTilte」は、もう使わないので、削除しても良いです。オブジェクトに日本語のレイベルやタイトルを付ける時に、メッセージ・ボックスから行うと上手く行かない事が多いので、こうしてフィールドを補助的に使う事が頻繁に出てきます。

日本語のフォント名だけのリストを作ります。作ってあるスクローリング・フィールドの名前を「tFontNames」としてください。ボタンを作ってレイベルを「フォント・リスト」にしました。「the fontNames」を使ってこのマシーンにインストールされているすべてのフォント名をリストアップして、さらに「the fontLanguage」が「Japanese」のもののみを書き出します。MacOSの場合はソートした方が奇麗に整理がつくので、ソートしてからフィールドのテキスト・フォント(textFont)を「Osaka」に、Windowsはソートしない方が奇麗に整理されているので、ソートしないでテキスト・フォント(textFont)を「Tahoma」にします。

on mouseUp
   set the cursor to watch
   get the fontNames
   repeat for each line tLine in it
      if the fontLanguage of tLine is "Japanese" then
         put tLine &cr after tJpFonts
      end if
   end repeat
   if the platform is "MacOS" then
      sort tJpFonts
      set the textFont of fld "tFontNames" to "Osaka"
   else
      set the textFont of fld "tFontNames" to "Tahoma"
   end if
   delete char -1 of  tJpFonts
   set the unicodeText of fld "tFontNames" to uniencode(tJpFonts)
end mouseUp

 オン マウスアップ    カーソルをウオッチにセット    フォント名のリストをゲットする(itに収納される)    リピート文 it の中のそれぞれのラインを「tLine」にして繰り返す      もしフォント・ランゲージが「Japanese」なら        「tLine」と行替え(cr)を「tJpFonts」の後ろにつける      もし(if)終わり    リピート終わり    もしプラットフォームが「MacOS」なら      「tJpFonts」をソートしなさい      フィールド「tFontNames」のテキスト・フォントを「Osaka」に設定    (プラットフォームがMacOS)でなかったら      フィールド「tFontNames」のテキスト・フォントを「Tahoma」に設定    もし(if)終わり    「tJpFonts」の最後のキャラクターを削除しなさい    ユニコードにした「tJpFonts」を       ユニコードテキストのフィールド「tFontNames」にセットしなさい  エンド マウスアップ    



MacOSでは上の左図、Windowsでは右図のようになります。Windowsでは英語名でも「Japanese」を返すフォントが多くあります。これらのフォント名で日本語テキストをセットします。始めにそれぞれのフォント名がどんな書体なのか試してみましょう。ボタンを作ってレイベルを「フォント名にセット」にしました。

on mouseUp
   set cursor to watch
   lock screen
   get uniDecode(the unicodeText of fld "tFontNames",english)
   repeat with i=1 to the num of lines of it
      set the textFont of line i of fld "tFontNames" to line i of it
   end repeat
end mouseUp

 オン マウスアップ    カーソルをウオッチにセット    スクリーンをロック    フィールド「tFontNames」のテキストをゲットして「it」に入れる    リピート文 「i」を1からitのラインの数にして繰り返す      フィールド「tFontNames」のライン「i」のテキスト・フォントを \ 「it」のライン「i」にセットしなさい    リピート文終わり  エンド マウスアップ   



フォント名をそれぞれのフォントにセットしました。

始めはユニ・エンコード「uniEncode」を使って、フォント名のリストをユニコードのフィールドにセットできるようにしました。「フォント名にセット」ボタンでは、フォント名をユニコードにしていると、スクリプトの中で使えないので、直接フィールドからテキストをゲットして、シングルバイト文字で返されたフォント名をそのまま使っています。ユニコードのフィールドからユニコードとして取り出して、それをユニデコード(uniDecode)して、「ANSI(English)」にした事と同じ内容です。

get the text of fld "tFontNames"

 直接ユニコードのフィールドから文字列をゲット

get uniDecode(the unicodeText of fld "tFontNames",english)

 ユニコードのフィールドから、一旦ユニコードを取り出して、 \ ユニデコード(uniDecode)を使って、ANSII(english)に変換

上の2行はまったく同じ働きをします。下の行はいったんユニコードで取り出して、スクリプトで使える「English」に変換しています。

次に日本文のサンプル・フィールドを作って、日本語文を入れます。ウェブに夏目漱石の草枕の始めの部分を、ユニコードの「UTF8」で作ったテキスト・ファイルが置いてありますから、カード上のテキスト・フィールドに取り込みます。フォント名のリストを入れたフィールド「tFontNames」の右隣に、スクローリング・フィールド「jpText」を作ってください。ボタン「ウェブから日本語」を作ってスクリプトは、

on mouseUp
   get url "http://kenjikojima.com/livecode/download/kusamakura.txt"
   set the unicodeText of fld "jpText" to uniEncode(it,utf8)
   set the textHeight of fld "jpText" to 20
end mouseUp

 オン マウスアップ    URl「url "http://kenjikojima.com/livecode/download/kusamakura.txt"」をゲット    ユニコードにしたエンコードしたUTF8の「it」を       ユニコードテキストのフィールド「jpText」にセットしなさい    フィールド「jpText」のテキストハイト(textHeight)を20にセットしなさい  エンド マウスアップ

クリックしてフィールド「jpText」に日本語を取り込みます。フィールド「jpText」はデフォルトのセッティングなので、フォント・サイズが11ポイントで、行間が14ポイントになっています。日本語では行間をほぼ全角アキくらい取った方が読みやすいので、ラインハイト(textHeight)を20ポイントにしました(下図赤枠)。



次にフォント名のリストをマウスでクリックすると、フィールド「jpText」のフォントがセレクトされたフォントに設定されるようにします。フィールド「tFontNames」をロックして、クリックした行を選べるように、「Don't warp」「Lock text」「List behavior」にチェックをします(下図)。



リストが選べる事を確認したら、クリックライン(clickLine)が使えるので、フィールド「tFontNames」に下のスクリプトを入れます。

on mouseUp
   put the text of the clickLine into tFontName
   set the textFont of fld "jpText" to tFontName
end mouseUp

 オン マウスアップ    クリックされたラインのテキストを「tFontName」に入れなさい    フィールド「jpText」のフォント(textFont)を「tFontName」に設定しなさい  エンド マウスアップ

フィールドをクリックすると「the text of the clickLine」で、ユニコードではないシングルバイトの『ANSI(english)』が返されますから、直接フォント名としてスクリプトで使えます。フォント名のクリックで、サンプルの日本語のフォントがセットされるようになっていますか。


日本語(ユニコード)の基礎 まとめ

  • フィールドから取り出す日本語は必ず「the unicodeText of フィールド名」、フィールドにセットする日本語も必ず「the unicodeText of フィールド名」を使う。

  • バリアブル(variable)に入れた日本語文字列(シングルバイト)を、日本語としてオブジェクトにセットする時は「uniEncode(バリアブル)」で、ユニコード(ダブルバイト)に変換してからセットする。

  • 「UTF8」など他のテキスト・フォーマットをLiveCodeに表示するときは、「uniEncode(バリアブル,元のフォーマット名)」を使って「UTF16」に変換してからオブジェクトにセットする。

  • フォント名など、ユニコードにして取り出した文字列はスクリプトでは使えないので、直接シングルバイトの「ANSI」で取り出すか、「uniDecode(ユニコードのバリアブル,english)」で、ユニコードからデコードの変換をして使う。

  • ユニデコードはLiveCodeのユニコード「UTF16」から、「UTF8」や『SJIS』など、他の文字コードに変換する時にも使える。



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

unicodeText

プロパティ(property)フィールドにユニコード(ダブルバイト・キャラクター)を表示させる

set the unicodeText of fld "jp2" to the unicodeText of fld "jp1"

put unicode

コマンド(command)フィールドにユニコード(ダブルバイト・キャラクター)を入れる

put unicode the unicodeText of fld "jp1" into fld "jp2"

unicodeLabel

プロパティ(property)オブジェクトのレイベルにUTF16を表示させる

set the unicodeLabel of btn "jp" to the unicodeText of fld "jp1"

fontNames

ファンクション(function)インストールしてあるフォント名を返す

put the fontNames into fld 1

fontLanguage

ファンクション(function)ユニコード・フォントの言語を返す

put the fontLanguage of fld 1

uniEncode

ファンクション(function)シングバイト・キャラクターをユニコードに変換する

set the unicodeText of fld 1 to uniEncode(the fontNames)

uniDecode

ファンクション(function)ユニコードをシングバイト・キャラクターに変換する

get uniDecode(the unicodeText of fld "tFontNames",english)

unicodeTitle

プロパティ(property)スタック・ウインドウのタイトルにユニコードを表示する

set the unicodeTitle of this stack to the unicodeText of fld "jpTitle"

textHeight

プロパティ(property)フィールドにあるテキストの行間のスペース

set the textHeight of fld "jpText" to 20




19: サンプル・アプリから、次のステップに進む

21:フィールドにある日本語の扱い




ⓒ 小島健治 / Kenji Kojima