(このパートはMacユーザーの方は読まなくてもたぶん大丈夫です)

Y!Widgetの中では、文字コードはUTF-8、改行コードはLFとなっているようです。 Windowsの標準では文字がShiftJIS、改行コードがCRLFとなっているので、相互に生成したファイルを受け渡そうとするとトラブルが生じます。

Windowsで書いたテキストファイルをWidgetで読み込むと文字化けした#

Windowsで普通に書いたファイルはShiftJISなので、Widgetには理解できません。
保存時にUTF-8で保存するように指定すれば大丈夫です。
逆に、Widgetが書くファイルはUTF-8なので、Windowsのメモ帳で読み込めます。
しかし、何かのログファイルとかみたいに文字コードを選んでいられない場合もありまして、この場合は高度な回避策が必要です。

私が試した方法は

  • COMインターフェースを使い、InternetExplorerに含まれるADODBというコンポーネントが持つ文字コード変換を利用する
COMの実験まではよかったのですが、ADODBだけははぜか呼び出せないようなのです。海外の本家フォーラムで聞いても、成功した話はないようでした。
  • コマンドラインで動く変換ソフトをWidgetのContentsフォルダに置き、変換コマンドを.batファイルに書き出し、fileSystem.Open関数でそれを実行させる
強引ですが成功しました。
苦しんだのは、あるプログラムの吐き出すログファイルに漢字名が使われていたので、Widgetから「convert 漢字ファイル.txt 漢字ファイルUTF9.txt」と書き出したバッチファイルの中身もまたUTF-8になってしまったことでして、これでは「漢字ファイル.txt」に触れません。
このバッチファイルをSJISに変換するバッチをもう一本Widgetから吐き出すという、非常に手間のかかる方法になってしまいました。

もしこれでWindows対応がうまくいったとして、OS Xのほうで動かすとどうなってしまうのでしょう。どうも不毛な考え方のようでもあります。

  • Widget Engineに機能を追加してしまう(未実験)
C:\Program Files\Yahoo!J\Yahoo! Widget Engine\UnixUtils\usr\local\wbin
というフォルダに、本来OS X用であるrunCoomand関数をWindowsで実行させるための、コマンドファイルがたくさん入っています。
OS XではrunCommandで好きな命令を実行させることが出来るのですが、Windowsでは基本的にムリということになっていて、しかしおそらくオフィシャルのウィジェットの互換性を保つために、上記フォルダにUNIXのzshと数種のコマンドファイルが入っているようです。

ここに、iconvとかのコマンドのCygWin版をもらってきて突っ込めば、文字コード変換対応のWidget Engineにならないかなーとか考えているのですが、どうでしょう。

  • JavaScriptで文字コード変換ライブラリを書く(たぶんムリ)
どこかで、SJISの文字列をUTF-8のURLエンコード化するとかのライブラリを書いた人がいたのですが、いくら万能といってもJavascriptでこういう仕事をするのは果たして・・・という疑問があるので、この路線はあまり考えないようにしています。

Windowsで書いたテキストファイルの改行を「/」などに置き換えられない#

someString.replace("\r\n","/")
とか書いて改行のある文字列を/区切りに置き換えようとしたのですが、これはうまくいきません。

最初のファイルは改行がCRLF なのですが、WidgetにOpenさせたところで、この文字列はLF改行に置き換えられてしまうのです。
よって

someString.replace("\n","/")
と改めるとうまくいきました。
Windows上で出力するとまたCRLFに変換されるので、受け取った人は内部の変換に気がつきません。

Widgetでテキストファイルを作ってJmEditorで読んだら1行おきに空行が生じる#

JMEditorではWidgetの出力したテキストファイルを見ると、なぜか文字コードと改行の自動判定がUTF-8/LFとなってしまうようです。
結果として、CRの改行とLFの改行が二度効果を発揮して1行おきの改行に見えてしまうのです。対策は、他のエディタで試してみることです。メモ帳なら正常に開けます。

例題#

ログビューアを作成してみましょう。
読み込むファイルは"testlog.utf8"という名前にしておきます。
ファイルの形式は UTF-8/CRLF とします。
ここから、「総処理数aaaabbbbcccc<改行>」という行を抽出します。
var strLog = filesystem.readFile("test.log.utf8",false);

var pattern = new RegExp("総処理数.*\n","g");
var strResult=(strLog.match(pattern));
普通に考えると"総処理数.*\r\n"になりそうなものですが、Y!Widgetではこれが効きません。
たぶんfilesystem.readFile のところですでに文字コードがLFのみに置き換えられているのでしょう。
ということで、行末は<LF>で指定するといいようです。

改行コードの非互換性というのは、通信の主役が電報とかだった時代から端を発する血統のゆゆしき問題だそうでして、たとえマイクロソフトが倒産しようともこれが統一される日が来ることはなさそうに思えます。 日本のYahoo!でがんばってこのへんを解消する仕掛けを用意して欲しいところです。

Add new attachment

Only authorized users are allowed to upload new attachments.
« This page (revision-1) was last changed on 28-Nov-2007 23:43 by UnknownAuthor