manekineko倉金家ホームページ

趣味の部屋/ホームページ余話

日本語のページアドレス

2012年12月27日 2013年1月26日 修正
 最近いろんなホームページを見ていて中にURLのページのアドレスに日本語を使っているサイトがあるのに気がつきました。一昔前だと常識的には考えられなかったような気がするのですが、WEBの世界の日本語対応もずいぶん進歩したのかなと思い、今のサーバーでURLのページアドレスに日本語がちゃんと使えるのか、どんな問題があるのかなどを知りたくてちょこっと試してみました。


 その昔ホームページを作っていて、ファイル名に日本語を使うとうまく表示できないという問題をさんざん経験しました。サーバーはVineLinux4で言語エンコーディングはEUC-JP、表示するパソコンはWindowsで言語エンコーディングはShift-JISでしたので、あまり深くも考えず言語コードが違うのだから当然だろうと思っていたのですが、ホームページ遊びを始めて幾星霜、少し利口になった今、当時の技術が未熟だっただけで「もしかしたらできるかもしれない」と思うようになり、ちょっと試してみたくなりました。

(ご注意)日本語ドメイン名(ピュニコードでエンコーディング)の話とはちがいます。
ページあるいは写真などのファイル名の話です。

 そもそも(日本語を使う場合)表示するページには必ずといっていいほど言語情報を書きますが、これを忘れたり間違ったりすると文字化けするのはご存じの通りです。でもファイル名にはこの言語情報はありません。したがって英語以外(マルチバイト言語)の場合ブラウザがどう解釈するか、それが実際と異なればファイルにアクセスできないことになります。
 現在マルチバイト言語のファイル名の標準的な解釈はUTF-8のようですが、ブラウザによってはそれ以外にも設定できることが話をわずらわしくしているようです。WindowsのInternetExplorerなどはインターネットオプションの「UTF-8のURLを送信する」「mailtoリンクでUTF-8を使う」といった項目のチェックを外してしまうとWindowsの言語であるShift-JISとして取り扱ってしまうようです。
 なんでこんなオプションがあるのかよくわかりませんが、もしかしたら企業内LANなどでWindowsネットワークに特化して使う場合などには便利なのかもしれません。

日本語のページ名をつけてみる
 現在このサイトを作成、表示しているホームページプログラム"IRORIBATA"にはページアドレスに名前をつける機能があります。名前をつけなければ記事の作成順のid番号が使われて、"index.html?id=150" といったページアドレスになるだけで、どちらでもかまわないのですが、英語は得意でないしめんどうなのであまり名前はつけていません。
 名前はサーバー内部だけのことを言うなら英語でも日本語でもかまわないはずです。(システムはUTF-8で言語設定は英語と日本語になっていますので、それ以外の中国語やロシア語のようなのはうまく表示できないと思いますが。)
 で、ためしにこのページに日本語のページ名をつけてみます。「日本語のページアドレス.htm」としてみます。「アドレス」の部分はわざと問題が多いといわれる半角カタカナにしてみました。(→あとでメールのところで半角がだめだったので全角に変えましたが。)
→問題ありません。デスクトップや内蔵のブラウザでもちゃんと表示されます。サーバー内部のことだけ言えば問題はなさそうです。

日本語ファイル名の写真をいれてみる
 ついでにファイル名に日本語を使った場合の問題点も検討してみます。
具体的には日本語の名前のついた写真をページに掲載、ちゃんとアクセスできるかを調べます。
 実はその昔写真のファイル名に日本語を使うとだめだった経験があるのですが、その頃は受け取ったファイル名をそのまま使っていました。WindowsパソコンからShift-JISのファイル名を受け取ってもそのまま使ってしまっていたのです。でも少しお利口になった今はサーバーに合わせてちゃんとUTF-8に変換してから使っています。
で、ためしにWindowsのInternetExplorerを使ってWindowsで日本語の名前をつけた写真を入れてみました。

OKです。
ちゃんと写真は入り、かつ表示されました。クリックすると拡大写真も表示できます。
WindowsマシンからアクセスしてもLinuxマシンからアクセスしても問題ありません。Macや携帯端末は持ってないので試していませんが。
 ただしログ(HTTPサーバーapacheのログ)に記録されるファイル名が少々長くなり、見てもどのファイルだかわかりにくくなります。記録されるファイル名は、"\xe4\xba\xac\xe9\x83\xbd\xe6\x99\x82\xe4\xbb\xa3\xe7\xa5\xad.JPG"です。(これがちょっといやだね。)

Windowsから各種ブラウザで表示させてみる
 さて、日本語(UTF-8)のページリンクを書いて、WindowsマシンからInternetExplorer, Firefox, Google Chrome, Safari, Operaでアクセスします。左のメニュー(INDEX)のリンクをクリックして表示させてみます。
 →いずれもページはちゃんと表示されます。
 またブラウザのアドレスバーに表示されるアドレスは概ね"kuragane.jp/日本語のページアドレス.htm"と日本語で表示されますが、Operaで「すべてのウェブアドレスをUTF-8でエンコードする」オプションがオフだと%表示になります。
 もちろんファイル名をURLエンコードし"%E6%97%...."の形にしておいてもちゃんとアクセスはできますが、ブラウザによっては表示されるアドレスも"%E6%97%...."になってしまい日本語にならないので全然おもしろくありません。これでは辞書を手繰って英語の名前を考えた方がまだましです。日本語をそのままローマ字で綴るというのもあまり賢そうに見えないのでやりたくありません。

 それにしてもやはり長いログが記録されます。ログに記録されるページアドレスは、"kuragane.jp/%E6%97%....htm"となっています。日本語のファイルにアクセスされたらしいとはわかりますが、これではどのファイルだかはやっぱりわかりません。
ログを日本語で記録させようとhttpd.confの設定をいくつか試してみましたが、いまのところうまくいきません。

ログを日本語化する
 仕方ないので、パイプを使ってログを修正(UTF-8コードに変換して)して書込むことにします。
%E5%97....などの%表記を日本語に変えます。これにより検索サイトからのリファラーの検索クエリーも日本語になり、ログがたいへんわかりやすくなります。
ファイル名を"URLtoUTF8"とし、/usr/local/bin/ にでも置いておきます。
#!/usr/bin/php
<?php
while($str = fgets(STDIN)) { // 読み込み。
mb_convert_variables('UTF-8', 'auto', $str);
$str = mb_eregi_replace('%u([0-9a-f]{3,4})', '&#x\1;', rawurldecode($str));
$str = html_entity_decode($str, null, 'UTF-8');
echo($str); // 出力
}
?>
そしてhttpd.confのログの指定をパイプ経由での書込に変えます。
ErrorLog  "| /usr/local/bin/URLtoUTF8 >> /var/log/httpd/error_log"
CustomLog "| /usr/local/bin/URLtoUTF8 >> /var/log/httpd/access_log" combined
ログファイルの"logs"のAlias指定は使えなくなるので、ログファイルのパスは絶対パスに変更します。

 変換プログラムはシェルスクリプトでもできると思いますが、最初echo -e, awk, nkfなどを使ってちょっとやってみたら標準入出力のバッファリング制御がうまくできず、phpで書いたら一発でうまくいったのでこれでいいことにしました。標準入出力を使っていますのでそのままフィルターとしても利用できます。

ブラウザに日本語ページアドレスを打ち込んでみる
 ブラウザのアドレスバーに日本語ファイル名のついたURLを打ち込んでみます。
いちいち打ち込むのは面倒なのでメモ帳にアドレスを書込み、それをコピーしてペーストします。

InternetExplorer8:限定付きOKです。
インターネットオプションの「UTF8のURLを送信する」がOFFになっているとだめです。Shift-JISのまま送信してしまうのでしょうか。その場合日本語の部分が"\x93\xfa\x96{\x8c........"などとなり、Error 404 Object not found!になります。

Firefox17:OKです。
ちゃんと表示されエラーはでません。

Google Chrome 23:OKです。
ちゃんと表示されエラーはでません。

Safari5:OKです。
ペーストだと勝手に半角カタカナを全角に変換されたりアドレスを打ち込むと勝手にへんな補完をされたりで手まどいましたがOKです。

Opera12:限定付きOKです。
オプションの「すべてのウェブアドレスをUTF-8でエンコードする」がONになっていないとだめです。日本語の部分が"\x1b$BF|K\8l$N%Z!......."などとめちゃくちゃな文字になってしまいサーバーからError 400 Bad request!が返ります。

 アドレスバーに日本語を打ち込むのはブラウザによっては設定を確認変更する必要があります。もっともこれは自分でやっていて知っているからできるのであって、MSIEなどでファイル名にUTF-8を使わない設定をしている人にはまずアクセスできないことになります。
InternetExplorerとOperaにこの項目があります。他のブラウザには見つけません。
UTF-8を使わない設定にするとたぶんShift-JISが使われると思いますが、最近のブラウザはUTF-8がディフォルトになっているとは思います(以前試しにいろいろいじってディフォルトを覚えておらずあまり自信はない)。

ブックマークしてそこから表示してみる
 Windowsパソコンの各ブラウザでこのページをブックマークし、ブックマークから表示させてみます。

Internet Explorer:OKです。
Firefox:OKです。
Google Chrome:OKです。
Safari:OKです。
Opera:OKです。

すべてOKで、いずれもちゃんとページが表示されます。

日本語ページアドレスをメールで送って表示させてみる
 私の使っているメールソフトはOutlookですが、Office2002のものでかなり古いですので、最新のものでは違うかもしれません。

 まずはテキストモード。
通常このOutlookに "http://...." を打ち込むと自動的にリンクを形成してくれます。
Internet Explorerのアドレスバーから表示されているアドレス "http://kuragane.jp/日本語のページアドレス.htm" をコピーしてOutlookにペーストしてみます。
→うまくリンクが形成されません。
表示は "http://kuragane.jp/日本語のページアドレス.htm" となっています。つまり日本語の部分は無視され英語の部分だけにリンクが形成されています。リンクをクリックすると "http://kuragane.jp/" にアクセスしてしまいます。
自動で作成されるリンクを修正する方法がわからないのでこれ以上やりようがありません。

 次にHTMLモード。
同様に日本語の部分が無視されたリンクが作られますが、手動でアドレスを指定してハイパーリンクを形成あるいは修正するのはできます。この方法でやってみます。
→やはりうまくいきません。どこかで半角カタカナの部分が全角カタカナに変換されています。どこで変換されるのかと送信済みアイテムを見ますとすでに全角カタカナになっていました。
ためしにハイパーリンクを作らず本文に単に半角カタカナを書いてメールを送ると全角になっています。自動的に変換されてしまうのですね。調べてみるとメールに使われるISO-2022-JPに半角カタカナはないのでメールソフトが全角に変換するというのが一般的な動作のようです。今まで全然知らなかった。
 仕方ないので、半角カタカナはやめてページのアドレスを全て全角で「日本語のページアドレス.htm」に変更してやってみます。今度はうまくアクセスできます。

 というわけで、メールで日本語のURLを知らせるのは問題が出る可能性があります。受信する側のメールソフトや設定のことも考えるとちょっと心配が残ります。

もっともこんなのはメールソフトの問題と言ってしまえばそれまでですが...。

FTPソフトを使ってみる
 いつも使っているFFFTPを使います。
ホストの設定で、ホストの漢字コードをShift-JIS、ファイル名の漢字コードをUTF-8(N)に、すなわち文字コードの指定をちゃんとやれば保存されるファイルの名前については問題ありません。
ただしページの内容についてはUTF-8以外で保存した場合リンク名がUTF-8ではないのでアクセスに問題が出ると思われます。ページの内容はUTF-8で作成もしくは変換する必要があるでしょう。(実際に試してはいませんが、たぶん。)



 ざっと(私の頭で)考えられる実用的な場面というのは以上なのですが、
結論からいうとすべてUTF-8にして半角カタカナを使わなければWEBリンクを使ったページの表示では問題はなさそうですが、アドレスを書類やメールで知らせてアドレスを打ち込んでもらう場合は要注意です。

 基本的にUTF-8のサーバーを使い、ページはサーバー側あるいはUTF-8のマシンで作成。ファイル名はすべてUTF-8を使用、または変換。
Windowsマシンを使ってページを作成してFTPを使ってアップロードする時は、ページはUTF-8で作成もしくは変換、さらにFTPサーバーの文字コードにUTF-8に指定しファイル名を変換してアップロード。
 UTF-8以外のサーバーだとサーバーの言語と異なるUTF-8で強引に保存すると文字化けして管理や運用がたいへんだし、そうしなければさらに出力する時もすべてUTF-8に変換する(アプリケーションでやってくれる場合はそのように指定する)必要があると思われます。実際そこまで試してはいませんが、とても面倒そうなので、今後サーバーはUTF-8を使うのがいいねということにしてお茶を濁したいと思います。
 さらに言うと、私が使用したソフトにはすべて日本語が設定してあります。もしそうでない場合どうなるのかという確認はできていません。

 今のところ特別な場合を除き日本語ファイル名を使うつもりはありませんが、なんとなく試してみたかったのでした。



追記 (2013年1月9日)
 海外からいろんな情報収集ロボットがけっこうきます。
このページを追加してからページアドレスの部分にまったくわけのわからないマルチバイトのファイル名を指定してくるアクセスが出てきました。もちろん404 Not Foundでエラーになっていますが、どうがんばっても日本語には変換できません。マイクロソフト(.serch.msn.comから)のロボットでさえまちがったおかしなURLでアクセスしてきます。
こんなの:
.../���������の���������������������.htm' not found or unable to stat
日本語のUTF-8というのは海外では通じないみたいです。

 おそらくその国独自の言語コードを使ったりして日本語を誤って解釈しそれでアクセスしてくるのではないかと思われますが、詳細は全く不明です。(同じ日本語の中でさえこういうことは起こるのだからあたりまえと言えばあたりまえかも。)
こういうのはログ監視プログラムでエラーを起こし、これ以上へんなエラーログが増えるとアタックアクセス等の判定に支障をきたします。
で、Agent名を見てロボットのアクセスには日本語のページアドレスではなくページのid番号を提示することにしましたが、普通のブラウザ名を騙るロボットも多いのであまり効果はないようです。

...日本語のページ名をつけるのはこのページだけにしておきます。

お粗末でした。