dreamedge.net

記事登録時に”Iconv::InvalidEncoding”が出る

2008-08-19T15:39:00+0000

さくらのレンタルサーバの環境でmephisto0.8を動かすと,記事の登録時にエラーが出て実行できなくなった.ログを見ると,”Iconv::InvalidEncoding (invalid encoding (“ascii//translit//IGNORE”, “utf-8”))”が出ていて,どうやらエンコードの変換ができてないもよう.

同等の変換をiconvに直接入れてみても,下記のようなエラーが出るので,どうやらさくらの環境(FreeBSD)だと対応していないエンコーディングなのが問題らしい.(同様のコマンドをDebian etch環境で動かすと普通に通る)

$ echo 'test' | iconv -t ascii//translit//IGNORE -f utf-8
iconv: conversion to ascii//translit//IGNORE unsupported

なので,問題を起こしているpermalink_fuプラグインを書き換えて対処することに.本来的にはlibiconv辺りを入れ替えるべきなんだけど,それが出来ないのがホスティングサーバのつらいところです.

具体的にはGoogle Groupsの”Mephisto blog”グループの記事にあるように,エンコーディング名にIGNOREを付けているところを変更すればよい.

--- vendor/plugins/permalink_fu/lib/permalink_fu.rb     2008-08-15 10:22:38.000000000 +0900
+++ vendor/plugins/permalink_fu/lib/permalink_fu.rb      2008-08-20 01:02:21.000000000 +0900
@@ -6,7 +6,7 @@ module PermalinkFu
     attr_accessor :translation_from

     def escape(str)
-      s = Iconv.iconv(translation_to + '//IGNORE', translation_from, str).to_s
+      s = Iconv.iconv(translation_to, translation_from, str).to_s
       s.gsub!(/\W+/, ' ') # all non-word chars to spaces
       s.strip!            # ohh la la
       s.downcase!         #

しかしこの”ascii/translit”エンコードって何なんだろう.phpでよくつかわれているらしいが,URLエンコードされた文字列を扱うためのものなのか???


Takahiro Kambe より:

「対応していないエンコーディング」ではなく、”//IGNORE”や”//TRANSLIT”は、GNU iconv独自の拡張です。

iconvライブラリがGNU iconvでないオペレーティング・システム(OpenSolarisなど)でも同じ問題は発生するはずです。

移植性を確保するのであれば、GNU iconv独自の拡張を使わないことです。