[Jetspeed-japan-dev] Re: [jetspeed] 日本語入力について

Back to archive index

Mamoru WATANABE mamor****@hotma*****
2002年 12月 19日 (木) 12:30:22 JST


渡辺です。

> いただきました.UTF8ParameterParser.java の親クラスなどを
> 追ってみて思ったのですが,RunDate から ParameterParser を
> とって,setCharacterEncoding にエンコーディングをセットして,
> recycle を実行すれば,良いのかなっと思いました.しかし,ここで

私も最初setCharacterEncodingでOKだと思っていました。でも実際には
HTMLフォームに日本語を入力した場合には、ParameterParserの
CharacterEncodingは常に"US-ASCII"のままです。

実はHTMLフォームを使った場合のContent-Typeはほとんどが(HTMLの<form>タ
グのデフォルトのenctype属性がapplication/x-www-form-urlencodedだから)
application/x-www-form-urlencodedになるため、既にエンコード済みのもの
であるから、Content-Typeにcharset=xxxxxとは付ける必要がなく(エンコー
ド済みの文字列にはUS-ASCII以外の文字が入らないから)、結果として
Request.getCharacterEncoding()では値をとってこれず、常に"US-ASCII"に
なってしまいます。

ではParameterParserのcharacterEncodingに"US-ASCII"以外をセットする方法
はというとShinsukeさんが仰るように
  (1) ParameterParser.setCharacterEncoding(String enc)を呼ぶ
  (2) ParameterParser.recycle(String enc)を呼ぶ
もしくは
  (3) 最初からParameterParserのcharacterEncodingをUTF-8固定にする
となります。ただ、(1)(2)の方法では

> もう一つはそれをどこで実行するかになると思っています.

という問題が発生して、HelloAction.javaやCustomizeSetAction.java等
Action部分のソース変更が必要になってしまうということになります。できれ
ばAction部分の変更なしでParameterParser.getString(String name)で値を取
れるようにしたかったのです。

また、(3)の方法では正常に日本語文字列を取得できませんでした。というの
もParameterParserの先祖クラスのBaseValueParserのgetString(String name)
の実装を見るとわかるのですが、全然characterEncodingは利用されていない
のです。従ってParameterParserのcharacterEncodingという変数に適切な値を
セットしても正常な日本語文字列を取得できません。これにより、(1)(2)の方
法でParameterParserのcharacterEncodingをセットしたとしても正常な日本語
文字列を取得できないということになります。

ということで、必ずParameterParserのgetString(String name)メソッドに手
を加える必要があるということになります。

別の実現方法として、
 (1) ParameterParserのgetString(String name)とは別にマルチバイトに対応
     したgetMBString(Stringname)メソッドを追加する方法
 (2) getString(String name)メソッドの名前をgetStringOrg(String name)の
     ように書き換え、ParameterParserの内部で使っているgetStringメソッ
     ドはgetStringOrgメソッドを使うように変更し、新たにマルチバイトに
     対応したgetStringメソッドを書き直す。
などを考えましたが、(1)の場合はAction部分のソースに変更が生じてしまう
ことと、(2)の場合はParameterParserがgetStringメソッドを内部的に多用し
ており書き直しが面倒だったことから今回のような実装になりました。


> あと,ユーザー名で日本語を使うものですが,こちらも
> おもしろいパッチだと思います.しかし,LDAP サーバーなどでは,
> 日本語を認めないものもあったと思います.ですので,
> 日本語を使えるパッチと,日本語などを拒否するパッチも
> 作った方がいいかなっと思いました.この辺は,プロパティファイルの
> パラメータで使えるようにするかどうかを決められると
> 便利かと思います.(たしかに日本語が使えた方が便利ですね)

個人的にはユーザ名に日本語を使うのは反対です。(^_^;
ただUTF8ParameterParserを作った結果、現状のJetspeedではユーザ名の制限
ができないために仕方なく対応させたものです(UTF8ParameterParserよりも
時間を大幅にとられました)。

問題になったのはURLエンコードする時の文字コードとエンコードされてきた
ものをデコードする時の文字コードに違いがあり、正常にデコードできないと
いう点です。ですのでできればユーザ名はURLエンコードが必要のない文字に
制限できればいいのですが...

--
渡辺 衛
mamor****@hotma*****



Jetspeed-japan-dev メーリングリストの案内
Back to archive index