キッズプレート、パスタおかわり

プログラミングやデジモノについてあれこれ
--.--.-- --:--|カテゴリ:スポンサー広告| コメント(-)

スポンサーサイト


上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
2010.02.22 18:33|カテゴリ:AppleScriptコメント(0)

AppleScriptで扱う日本語(マルチバイト)文字列について


仕事用メモメモ ※※注意※※2007年10月にまとめた記事です


 以前まとめたPerl5.8.xの日本語まとめに引き続き第二弾。本日はAppleScript内での日本語の扱いについて簡単にまとめてみました。

 私のMacintosh歴はOS Xスタートなので、OS 9 環境でのAppleScriptの挙動にあまり詳しくありません。それどころかAppleScriptそのものについて実はそれほど使った事がないというのが実情です。しかしながら、先日会社の人とAppleScriptで日本語を扱うことがあり文字化けにかなり頭を悩ませたので調べた内容をまとめておきます。

【動作確認環境】「OS X Ver 10.4.9」「スクリプトエディタ 2.1.1(81)」「AppleScript 1.10.7」

 この手の話なのでGoolge等で検索してみればかなり詳しい頁があります。詳細はそれらの頁におまかせして、ここでは単純明快、単刀直入にまとめてみます。

 文字化けがなぜおこるかと言えば文字コードの扱いに問題があるからというのが主な理由です。まずはAppleScriptで扱える日本語(マルチバイト)文字列の種類をまとめてみましょう。扱える主なマルチバイト文字は以下の3つです。

エンコード
StringMacEncoding(MacJapanese)
Unicode textUTF-16
«class utf8»UTF-8

 String は、MacEncoding として扱われます。これは言語設定で表示されている項目の最上位の値が参照され日本語の場合はMacJapanese(マックのShift-Jis)です。Unicode text は、UTF-16 のエンコーディングになります。«class utf8»はutf-8エンコードになります。

 スクリプト内で直接記述されたテキストは「string」になります。stringはas演算子を使って「Unicode text」「«class utf8»」にそれぞれ変換可能です。
set moji to "あいうえお"
set uni16 to moji as Unicode text
set uni8 to moji as «class utf8»
 ただし、Unicode text や «class utf8» からstringへの変換はおすすめできません。扱える文字の範囲の違いにより文字化けが発生する可能性が高くなります。Unicode textと«class utf8»の場合は、エンコードは違えども同じユニコードですので相互変換は当然可能です。以下、型変換を簡単に表にまとめてみます。

Stringへ変換Unixode textへ変換«class utf8»へ変換
String---
Unicode Text×---
«class utf8»×---
※上記で×になっていても変換は行えます。ただ文字化けが発生する確立が高いということを認識していてください

 文字列の比較ではエンコードに関係なく文字の違いを判別してくれます。
set moji to "あいうえお"
set uni16 to moji as Unicode text
set uni8 to moji as «class utf8»
if moji = uni8 and moji = uni16 and uni8 = uni16 then
	display dialog "OK"
else
	display dialog "NO"
end if
 上記を実行すると「OK」と表示されます。

 ところがファイルに出力する際にはそれぞれの型に応じたエンコードの値で出力されます。スクリプトから出力したファイルが文字化けしている場合、writeの際の文字コードが統一されていないのが主な原因です。同じファイルハンドルにString文字列とUnicode text文字列を同時に出力してしまうと文字化け発生、というわけです。
write str to fh as Unicode text
 上記のようにwriteとともにas演算子で型指定をすると指定したエンコードで出力されます。ちなみにas演算子による型指定をしないままそれぞれの型文字列をwriteでファイルに出力すると、

「String」→MacJapanese
「Unicode text」→UTF-16
«class utf8»」→UTF-16

 となります。ファイル出力ではwriteとともに必ずas演算子で型指定をするのが不慣れなうちはよいかもしれません。

 一方ファイルの読み込みではreadで「as Unicode Text」等の型指定を行えば指定通りの文字コードで読み込みがされます。ただし、
read (choose file) as Unicode text
 という指定の意味は、

「読み込んでいるファイルの文字列がUTF-16である」

 というのをスクリプトに伝えるものです。決してShift-Jis等のファイルをUTF-16に変換してくれるわけではないのでご注意ください。

 以上が簡単なマルチバイト文字の取り扱いです。この他にもユニコードのファイルを取り扱う際にはBOM(バイト・オーダー・マーク)なんていう決め事もあるのでそれらもあわせて調べておくとよいやもしれません。
コメントの投稿












管理者にだけ表示を許可する
トラックバック
この記事のトラックバックURL

プロフィール

ひらくん Author:ひらくん
どもども、ひらんくんどす。
日々まったり過ごしております。
仕事はDTP関連のスプリクト&アプリケーション開発。
Follow happyscript on Twitter

ブログ内検索



上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。