CGIKit2の文字コードの処理について(2)

[前回の続き。][1]

CGIKit 2.xでは、文字コードにUTF-8を推奨している。([CGIKit – 日本語処理][2])

しかし、ruby 1.8.2のKconvでは UTF-8 に変換できない。([るびま][3])

変換できないことを確認してみる。

require ‘kconv’

# UTF-8 で表された ‘Hello, るびま!’
str = “\x48\x65\x6c\x6c\x6f\x2c\x20\xe3\x82\x8b\xe3\x81\xb3\xe3\x81\xbe\xef\xbc\x81”

puts Kconv.guess(str) # => 6 == Kconv::UTF8 正しい
str = Kconv.kconv(str, Kconv::UTF8) # UTF-8をUTF-8に変換する
puts Kconv.guess(str) # => 1 == Kconv::JIS

# Shift_JIS で表された ‘Hello, るびま!
str = “\x48\x65\x6c\x6c\x6f\x2c\x20\x82\xe9\x82\xd1\x82\xdc\x81\x49”

puts Kconv.guess(str) # => 6 == Kconv::UTF8 正しい
str = Kconv.kconv(str, Kconv::UTF8) # Shift_JISをUTF-8に変換する
puts Kconv.guess(str) # => 1 == Kconv::JIS

対策としては、[るびま][3]にもあるように [修正されたkconv.rb][4] を使用するのがよさそう。

[修正されたkconv.rb][4] をlibディレクトリにコピーすれば、使えるようになる(はず)。

[1]: http://www.gesource.jp/weblog/archives/2005/09/cgikit2_2.html
[2]: http://cgikit.sourceforge.jp/cgi-bin/ja/index.cgi?%C6%FC%CB%DC%B8%EC%BD%E8%CD%FD
[3]: http://jp.rubyist.net/magazine/?0009-BundledLibraries#l13
[4]: http://www.ruby-lang.org/cgi-bin/cvsweb.cgi/ruby/ext/nkf/lib/kconv.rb?only_with_tag=ruby_1_8

CGIKit 2.xを手動でインストールする

CGIKit 2.xを手動でインストールする

ローカルの開発環境ではCGIKit 2.xをインストールできても、実際に動作させるサーバではインストールできない場合もよくあります。

そういう場合のインストール方法。

ckproject でプロジェクトを作成した場合、次のようなディレクトリが作られます。

Sampleプロジェクトを作成すると、

ckproject Sample

ディレクトリ階層は、こうなる。

Sample/
components/
lib/
resources/

ckprojectによって作られたソースコードには、libディレクトリを$LOAD_PATHに追加するコートがあります。

$LOAD_PATH.unshift(‘lib’)

したがって、libディレクトリにライブラリを置けば、setup.rbでインストールしたときと同じように、ライブラリをロードできます。

[cgikit-2.0.0-preview-1.tar.gz][1] をダウンロードして、cgikit-2.0.0-preview-1フォルダに展開したとします。

Sample/lib/ ディレクトリに、cgikit-2.0.0-preview-1/lib/ディレクトリのファイルをすべてコピーすれば、完了です。

Sample/
components/
lib/
cgikit/
components/
CKErrorPage/
elements/
lang/
project/
templates/
en/
ja/
uconv/
resources/

[1]: https://sourceforge.jp/projects/cgikit/files/

CGIKit2の文字コードの処理について

[るびま0009号][1]の[Nvu と CGIKit2 による Web アプリケーション開発][2]の記事を試しました。

Registration.rbに、

module Registration
module UserInfo
def to_utf8
@name = Kconv.toutf8(@name)
@age = Kconv.toutf8(@age)

というコード変換の処理を追加していますが、これは必要なんでしょうか。

[CGIKit – 日本語処理][3] によると

CGIKit::Application#encoding

に文字コードを設定すればいいように思えます。

また、cgikitconf.rb の

def configure_localization
# @encoding = nil

を設定してもいいように思えます。

試しに Kconv::UTF8 を指定してみたら、文字化けしました。あれ?

もうちょっと調べてみます。

追記

ちょうど同じ号にある[標準添付ライブラリ紹介【第 3 回】Kconv/NKF/Iconv][4] の記事を読むと、[KconvのBUG][5] に気になる記述が…。

試しに、cgikit/lang/ja.rb のKconvの処理をNKFに置き換えてみると、

class DynamicElement
def encode_string( string, encoding )
#Kconv.kconv(string, encoding)
case encoding
when Kconv::EUC
return NKF.nkf(‘-e’, string)
when Kconv::SJIS
return NKF.nkf(‘-s’, string)
when Kconv::JIS
return NKF.nkf(‘-j’, string)
when Kconv::UTF8
return NKF.nkf(‘-w’, string)
end
end
end

文字化けの問題が解消しました。どうやら既知のバグだったようです。

でも、どうして Registration::UserInfo::to_utf8() はうまくいっているのだろう。

もうちょっと調べてみます。

[続く][7]

[1]: http://jp.rubyist.net/magazine/?0009
[2]: http://jp.rubyist.net/magazine/?0009-CGIKit-2.x
[3]: http://cgikit.sourceforge.jp/cgi-bin/ja/index.cgi?%C6%FC%CB%DC%B8%EC%BD%E8%CD%FD#l13
[4]: http://jp.rubyist.net/magazine/?0009-BundledLibraries
[5]: http://jp.rubyist.net/magazine/?0009-BundledLibraries#l11
[7]: http://www.gesource.jp/weblog/archives/2005/09/cgikit22_1.html

CGIKit2のコンポーネントとエレメント

CGIKit2の[コンポーネント][1]はHTMLに表示するためのもので、[エレメント][2]は値の表示と同期を行います。

だから、値の同期が必要ならサブコンポーネントを作るのではなくて、エレメントを作らないといけないことに気がつきました。

サブコンポーネントについては[Tutorial5.5][3]と[Tutorial6][4]に詳しい解説がありますが、エレメントの作り方のドキュメントはないようです。ソースコードを探索しましょうか。

あと、[CGIKitメーリングリスト – 760][5] で報告されている問題にはまってしまいました。

[2.0.0-preview-1][6]が公開されてから、たくさんの変更が行われているようですので、preview-2 を公開が待ち遠しいです。

[1]: http://cgikit.sourceforge.jp/cgi-bin/ja/index.cgi?%A5%B3%A5%F3%A5%DD%A1%BC%A5%CD%A5%F3%A5%C8
[2]: http://cgikit.sourceforge.jp/cgi-bin/ja/index.cgi?%A5%A8%A5%EC%A5%E1%A5%F3%A5%C8
[3]: http://cgikit.sourceforge.jp/cgi-bin/ja/index.cgi?Tutorial5.5
[4]: http://cgikit.sourceforge.jp/cgi-bin/ja/index.cgi?Tutorial6
[5]: http://www.freeml.com/message/cgikit@freeml.com/0000760
[6]: https://sourceforge.jp/projects/cgikit/files/