- PR -

Tomcatで日本語ファイルへのリンク

投稿者投稿内容
スフレ
ぬし
会議室デビュー日: 2005/05/27
投稿数: 281
お住まい・勤務地: 東京
投稿日時: 2006-07-13 21:00
はしもとさんが書かれているとおり、URIEncoding="UTF-8" を追加したら、ちゃんと日本語ファイル名でアクセスできることを確認しました。

なので、

  • IEで「常にUTF-8でURLを送信する」がオン
  • リンク元のHTMLの文字コードがUTF-8で「<a href="/data/テスト.pdf">」
  • リンク元のHTMLの文字コードは何でもいいけど「<a href="/data/%E3%83%86%E3%82%B9%E3%83%88.pdf">」

などでOKそうですね。
はしもと
大ベテラン
会議室デビュー日: 2003/02/05
投稿数: 182
投稿日時: 2006-07-14 00:26
引用:
スフレさんの書き込み (2006-07-13 21:00) より:

  • リンク元のHTMLの文字コードがUTF-8で「<a href="/data/テスト.pdf">」



HTML の文字コードと URL エンコードの文字コードは無関係です。
HTTP クライアントが HTML の文字コードを正しく認識できれば、
その文字コードの文字列を IE が UTF-8 で URL エンコードするので。

で、ここからは元の質問の趣旨と違ってしまいますが、
そもそも HTML で URI を指定する属性の値に非 ASCII 文字を
含む場合、URL エンコードしなければならないと思います。
なので <a href="/data/テスト.pdf"> は正しい HTML の書き方
ではありません。

一方、URL エンコードの文字コードと Tomcat の Connector 要素の
URIEncoding 属性は同じでなければなりません。
というか同じになる様にするのです。
なので URIEncoding="UTF-8" としたなら、このコンテナから
返信する HTML のリンクは全部 UTF-8 で URL エンコードします。


[ メッセージ編集済み 編集者: はしもと 編集日時 2006-07-14 00:57 ]
NV
ベテラン
会議室デビュー日: 2003/05/20
投稿数: 73
投稿日時: 2006-07-14 09:31
>>はしもと様
>>スフレ様

返信遅れて申し訳ございません。
当方でも、リンクできることを確認しました。いろいろ参考になります。

引用:

なので URIEncoding="UTF-8" としたなら、このコンテナから
返信する HTML のリンクは全部 UTF-8 で URL エンコードします。



Connector 要素のURIEncoding 属性を追加変更することによって、日本語ファイルへのリンク以外の部分に影響があるかどうかを、現在サイト全体確かめておりますが、おそらく問題ないと認識しております。

的確なアドバイス大変感謝しております。
今後ともよろしくお願いいたします。
T2
常連さん
会議室デビュー日: 2002/02/20
投稿数: 37
投稿日時: 2006-07-14 18:26
ええと、現在のバージョンのTomcatではHTTPリクエストヘッダに対しては
setCharacterEncoding()メソッドのの処理対象外になります。
よくある「postだと日本語リクエストパラメータが化けないが、getだと化ける」問題と
同じ理由ですね。
Connector 要素のURIEncoding 属性で決め打ちしても良いですが、
Connector 要素にuseBodyEncodingForURI="true"を追加しても良いのでは?
前者だとURIEncoding 属性の設定値がアプリだけじゃなくコンテナ全体に波及してしまい、
他のアプリケーションがデプロイされている場合にそちらもUTF-8に統一する必要が出てきます。
NV
ベテラン
会議室デビュー日: 2003/05/20
投稿数: 73
投稿日時: 2006-07-15 00:43
T2様

大変有用な情報ありがとうございます。

今回の件に関しては、他にアプリが増える予定もないので問題ないと思いますが、非常に重要な情報ですので、今後とも活用させていただきます。

ちなみに、これらの情報はどの辺が正規の情報源なのでしょうか?
英語だとは思いますが、是非一度、Tomcatの仕様を見直したく思っております。

以上、皆様ありがとうございます。
T2
常連さん
会議室デビュー日: 2002/02/20
投稿数: 37
投稿日時: 2006-07-15 09:28
Servlet API仕様のServletRequest#setCharacterEncoding()の仕様を見ると
「Overrides the name of the character encoding used in the body of this request.」
とあります。
http://java.sun.com/j2ee/1.4/docs/api/javax/servlet/ServletRequest.html#setCharacterEncoding(java.lang.String)
「現在のリクエストのボディに使われる文字エンコーディング名を上書きします」です。

この仕様に厳密に沿うように、Tomcat4.1.29/5.0.16以降では、
ヘッダに対してはsetCharacterEncoding()が処理を行わないように実装が変更されました。

しかし、Edosson様の投稿にあったように、バージョン間での動作の互換性の問題が出たため、
TomcatではuseBodyEoncodingForURI属性が追加されました。
http://tomcat.apache.org/tomcat-5.5-doc/config/http.html

ただし、Tomcat4.1.30ではuseBodyEoncodingForURIのデフォルト値はtrueになっています。
Tomcat5.xではデフォルト値はfalseです。

正規の情報源・・・うーん、私はTomcatの開発者MLを読んでいますし、上記の話は
Craig MacClanahan氏や吉田豊氏からも直接お話を伺っていますし・・・・
上記の資料は正規のものですが、コトの経緯の「正規の情報源」はちょっと難しいです。
Tomcatの開発者MLのアーカイヴをあさってみるしか無いですかね?
NV
ベテラン
会議室デビュー日: 2003/05/20
投稿数: 73
投稿日時: 2006-07-15 13:27
T2様

ご丁寧にご回答ありがとうございます。

>> 上記の資料は正規のものですが、コトの経緯の「正規の情報源」はちょっと難しいです。
>> Tomcatの開発者MLのアーカイヴをあさってみるしか無いですかね?

なるほど。やはりコアな情報源はMLだったりするのですね。
バージョンの違い等は、事の経緯を知っている方々の強みですね。

今回の件、簡単にできそうな事が、できそうで出来なかったので、お話が深くなりましたが、とても参考になりました。

私のような俄かエンジニアにとっては、とてもコアな内容の印象を受けますが、皆様のような方々がアドバイスしてくださる事は、とても光栄な事です。

今後ともよろしくお願い致します。

[ メッセージ編集済み 編集者: NV 編集日時 2006-07-15 13:31 ]

スキルアップ/キャリアアップ(JOB@IT)