Yahoo!ウィジェット の作り方と注意点 (3) - 文字化け&二重入力

多分最終回。Yahoo!ウィジェットで開発するときの注意点2つ。

外部 API を呼び出すと文字化け

Yahoo! Widgets で外部 API を呼び出す代表的な方法に、XmlHttpRequest を使って XML データを取ってくる方法と、JSON(JSONP) を取ってくる方法の2種類があるだろう。
前者の XML を取ってくる場合は問題ないのだが、後者の場合は実は文字化けが発生する。
XML データは先頭の <?xml 〜 を見て文字コード判定しているようなのだが、JSON データは、例えレスポンスヘッダに文字コードが吐かれていても Laten-1 とみなして UTF-8 に変換が行われるらしく、2バイトコードはどの文字コードであっても全滅。


ちなみに、Twitter APIJSON なのだが、実は Unicode エンコードによってマルチバイト対応しているので、Yahoo! Widgets でも日本語が化けない。
まあでもそれはたまたま大丈夫なだけであって、通常の日本の JSON 系 WebAPI や、海外の API であってもまじめにマルチバイト対応しているもの(例: Google Calender )などは否応なく化けてしまう。


対応策としては、Unicode エンコードに変換するプロキシーを間に挟むというのが確実だろうとは思うのだが、そんな面倒なことはしたくないという向きには、id:nazoking さんが誤変換されたデータを逆変換して正常なデータに戻す関数を作ってくれているので、それを使うのが吉。

文字化けを解消するかもしれない Latin1toUtf8
http://d.hatena.ne.jp/nazoking/20060807#1154937052

ただ、エントリのタイトルに「かもしれない」とあるように、確実な動作は保証されていない。


明らかに Yahoo! Widgets の方で対応すべき問題なので(実際、XML の方では出来ているのだから簡単にできるはず)、できるだけ早期に直して欲しいところ。
「WebAPI コンテストやってるので Yahoo! Widgets でいろいろ作ってください〜。え? 日本語が化ける? 仕様です」じゃあ本気度を疑われても仕方ないと思うので……

テキストエリアに同じ内容が勝手に2回入力される

Yahoo! Widgets は textarea というビュー(コンポーネント?)で文字入力を行わせることができる。
この textarea を1行サイズで設置して、文字入力を行ってみると、桁あふれをまたいで日本語入力した内容が勝手に2回分入力されてしまうという現象が発生する。
わかりにくいと思うので、簡単に具体例。

<?xml version="1.0" encoding="UTF-8"?>
<widget version="0.1" minimumVersion="3.0" debug="on">
  <window name="mainWindow" title="タイトル" width="320" height="240" visible="true">
    <textarea name="myText" hOffset="0" vOffset="20" size="12" width="100" bgColor="#ffffff" bgOpacity="255" />
  </window>
</widget>

という *.kon ファイルを作って起動。入力欄に「日本語入力します」と打つと、テキストエリアには「日本語入力します日本語入力します」と入ってしまう。


この現象は「テキストエリアの高さを少し広げる」ことで回避できる。*1
このサンプルの場合、コンソールで print(myText.height) するとデフォルトの高さが 14 になっていることがわかるので、現象が出なくなるまで高さを広げていくと、myText.height=16 で解消。
この高さは文字サイズによって変わるので、適宜。


もちろん言うまでもなく、同じく早期に直して欲しい。っていうか、悪いこと言わないから直した方がいいってホントに。

蛇足

しまった、最後に DIS ったみたいになってしまった……構成間違ったかな。
Yahoo! Widgets はコンソールがそこそこ強力で、設定画面が楽勝というあたりは結構気に入っている。
お手軽クライアントアプリの開発に興味にある人は手を出してみても損はないと思う。


フォローになった?

*1:気づいたオレ偉い! と思った後、なぜか少し落ち込んだのは内緒だ