Titanium Desktopにおける日本語の取り扱い
日本人開発者なら、気になるであろうTitanium Desktopの日本語の扱いがどうなっているかについて、把握している範囲で書きたいと思います。
海外発の技術の場合、大体日本語問題はついて回りますよね。
Linuxに関してはあまり調査してないので、ここでは主としてOS XとWindows環境についてのエントリーとなります。
で、私の知識不足もあって、わかってない事が結構ある状態です。
なお、View層であるHTMLに日本語を表示させる為のソースコードの取り扱いについてのエントリーになります。
Fileの読み書き時の扱い等についてはこのエントリーでは触れません。
また、PHPはあまり興味がないので調べていません。すみません。
PHPerで興味ある方はぜひ調べていただければと思います。
あと、Pythonはあまり詳しくないのでPythonistaの方の突っ込みも希望><
で、結論を先に書いておきますと、とにかくUTF-8にしておけ。です。
あと、WindowsのRubyやPythonは今時点で一手間必要です。
現状のTitanium Desktopは、OS Xでは、基本UTF-8で使う分にはRuby,Python含めてhtmlでの日本語表示OK。
Windows環境では、htmlとjavascriptについては、htmlファイルのメタタグのcharsetによる指定とファイルエンコーディングでShift_JISやEUC-JPを表示したり出来ますが、Appcelerator的にはUTF-8で内部的に処理という扱いが正しい挙動のようで、次のバージョンで基本的にUTF-8で表示と修正されるようです。
なので、UTF-8を使っといた方がいいでしょう。で、RubyやPython等、JavaScript以外をWindowsで扱う場合には現状では注意が必要です。
では順に行きます。
htmlとjavascriptから。
まずOS Xですが、メタタグでeuc-jpやShift_JISを指定してhtml,javascriptファイルのエンコーディングをそれにあわせても、文字化けします。
Titanium Desktop SDKはこの部分、内部的に全てUTF-8で処理するようです。
よって、ソースコードのエンコーディングをUTF-8にしておく必要があります。UTF-8にしておけば、化けずに日本語を表示できます。
Webの技術ではありますが、デスクトップアプリという事を考えればUTF-8に統一というのはこれで正しい挙動・・なのでしょうか?うーむ。どうあるべきなのか有識者の意見が欲しいです*1。
一方Windowsですが、今時点でメタタグとファイルエンコーディングをあわせれば、shift_jisやEUC-JPも日本語が表示可能です。
ですが、次期バージョンで修正され、Macと同じく内部的にいつもUTF-8で処理するようになるようです。
続いてRubyやPythonを扱う場合です。
なお、RubyやPythonのバージョンですが、WindowsのDesktop SDK0.8.4ではRubyは1.8.6で、Pythonは2.5.4です。OS Xの0.8.4ではRubyは1.8.7で、Pythonは2.5.4です*2。
RubyやPythonは、当たり前といえば当たり前ですが、htmlのメタタグの指定の影響はうけません。
よって、<script type="text/ruby">....</script>や<script type="text/python" src="test.py"/>などと記述されたソースコードはRubyやPythonの世界となります。
また、RubyやPythonで用意した日本語ストリングの変数をHtmlに渡して表示する場合を想定しています。
RubyやPythonの内部でごにょごにょと日本語ストリングを処理したりというのはまた別の話になります。
MacとWindowsで状況が異なります。
まずOS Xの場合、ファイルのエンコーディングにUTF-8を使用している分には、ソースコードに日本語のStringオブジェクトを書いても表示出来ます。
Pythonもu"パイソン"ではなく、直接日本語書いて問題ありません。
しかし、ファイルエンコーディングとメタタグをEUC-JPやSHIFT_JISにすると文字化けします。
Titanium Desktopの内部的には全てUTF-8で決めうちして処理しているようです。
次、Windows環境です。
Rubyの場合、今時点のTitanium Desktopでは、ファイルのエンコーディングに関わりなく、日本語のStringオブジェクトのエンコーディングはOSのデフォルトロケールとなっているようです。
つまり、Rubyの場合はSJISとなっています。
よって、Rubyの場合であれば、require 'kconv'等して、都度ストリングを'ルビー'.toutf8とするか、$KCODE='u'として、コード全体をUTF-8にしてやれば日本語を表示させる事が出来ます。
ただし、$KCODE='u'としてやる場合は、Titanium Desktop内において、開発者がいじれる範囲にRubyのエントリポイントが用意されているわけではない為、どこからエンコーディングを変えたのか注意する必要があります。
ちなみにUTF-8にエンコーディングしてやらないと、日本語は表示されません、文字化けではなく、表示が出来ません。
メタタグにてcharsetをSHIFT_JIS等にしてそれにあわせてtosjisやtoeucをあわせて使っても表示されません。
Rubyからは、UTF8でないと、htmlに日本語を表示出来ないようです。
Pythonの場合ですが、import sys;sys.getdefaultencoding()してみるとasciiとなっています。
んで、ごちゃごちゃやって日本語表示出来たりしたのですが、そもそもPythonはお作法をあんまり分かってないので・・。
http://support.appcelerator.net/discussions/titanium-desktop-problems/48-the-multi-byte-character-cannot-be-displayed-with-ruby-and-pythonwin
私がフォーラムに投稿した際の回答からすると、多分、Windows環境についても、次のバージョンでは、基本的にUTF-8で処理されるようになるようですので、OS Xの挙動に準拠すると思われます*3。
以下Windows環境で確認してみたコード
<html> <head> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" /> <script type="text/python"> import sys def helloPython(): alert(sys.getdefaultencoding()) #ascii display bar = window.document.getElementById('output') alert(bar.innerHTML) #Japanese character string display bar.innerHTML ='パイソン'.decode('mbcs').encode('utf-8') //'output' innerHTMLがパイソンに window.helloPython = helloPython </script> <script type="text/ruby"> require "nkf" #Kanji cord conversion library require "kconv" #NKF wrapper library #preparation encoding dictionary CODE_TO_NAME ={ NKF::JIS=>"JIS", NKF::EUC =>"EUC", NKF::SJIS=>"SJIS", NKF::UTF8=>"UTF8", NKF::UTF16=>"UTF16", NKF::BINARY=>"BINARY", NKF::ASCII=>"ASCII", NKF::UNKNOWN=>"UNKNOWN" } def helloRuby alert($KCODE) #NONE $KCODE='u' alert($KCODE) #UTF8 #encoding guess method alert(CODE_TO_NAME[NKF.guess("ルビー")]) #SJIS alert("ルビー") #blank display alert("ルビー".toutf8) #utf8string display foo= window.document.getElementById('output').innerHTML alert(CODE_TO_NAME[NKF.guess(foo)]) #ascii alert(foo.toutf8) #japanese character string display alert(foo=="クリック") #false alert(foo=="クリック".toutf8) #true end window.helloRuby = helloRuby </script> </head> <body> <div id="output">クリック</div> </body> </html>