Titanium Desktopにおける日本語の取り扱い

日本人開発者なら、気になるであろうTitanium Desktopの日本語の扱いがどうなっているかについて、把握している範囲で書きたいと思います。
海外発の技術の場合、大体日本語問題はついて回りますよね。

Linuxに関してはあまり調査してないので、ここでは主としてOS XWindows環境についてのエントリーとなります。
で、私の知識不足もあって、わかってない事が結構ある状態です。

なお、View層であるHTMLに日本語を表示させる為のソースコードの取り扱いについてのエントリーになります。
Fileの読み書き時の扱い等についてはこのエントリーでは触れません。
また、PHPはあまり興味がないので調べていません。すみません。
PHPerで興味ある方はぜひ調べていただければと思います。
あと、Pythonはあまり詳しくないのでPythonistaの方の突っ込みも希望><


で、結論を先に書いておきますと、とにかくUTF-8にしておけ。です。
あと、WindowsRubyPythonは今時点で一手間必要です。
現状のTitanium Desktopは、OS Xでは、基本UTF-8で使う分にはRuby,Python含めてhtmlでの日本語表示OK。

Windows環境では、htmlとjavascriptについては、htmlファイルのメタタグのcharsetによる指定とファイルエンコーディングShift_JISEUC-JPを表示したり出来ますが、Appcelerator的にはUTF-8で内部的に処理という扱いが正しい挙動のようで、次のバージョンで基本的UTF-8で表示と修正されるようです。
なので、UTF-8を使っといた方がいいでしょう。で、RubyPython等、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_jisEUC-JPも日本語が表示可能です。
ですが、次期バージョンで修正され、Macと同じく内部的にいつもUTF-8で処理するようになるようです。


続いてRubyPythonを扱う場合です。
なお、RubyPythonのバージョンですが、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
RubyPythonは、当たり前といえば当たり前ですが、htmlのメタタグの指定の影響はうけません。
よって、<script type="text/ruby">....</script>や<script type="text/python" src="test.py"/>などと記述されたソースコードRubyPythonの世界となります。
また、RubyPythonで用意した日本語ストリングの変数をHtmlに渡して表示する場合を想定しています。
RubyPythonの内部でごにょごにょと日本語ストリングを処理したりというのはまた別の話になります。


MacWindowsで状況が異なります。
まず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>

*1:ちなみにAdobe AIRのhtmlは、SHIFT_JISとかセットしてもファイルのエンコーディングをあわせれば、ちゃんと文字化けせずにhtmlに日本語が表示されますよね

*2:プラットフォームでバージョンが違うのはちょっと嫌ですね

*3:と、受け取ったんですけど・・。