[Subject Prev][Subject Next][Thread Prev][Thread Next][Subject Index][Thread Index]

[webdav-jp:0567] サーバの文字コードを EUC-JP にすると文字化け



はじめまして。質問です。

mod_dav-1.0.3-1.3.6 + mod_dav-1.0.3-1.3.6-l10n.diff と
mod_encoding-20020611aで、サーバの文字コードをEUC-JPにすると
windows2000上のwebフォルダが文字化けしてしまいます。
さらにサーバ上でもディレクトリが文字化けしてしまいます。

これを直す方法を教えてください。

例えば、webフォルダ上で「新しいフォルダ」を作成して
最新の情報に更新すると、

ミVツ?ツ?テtテテHテヒテ_ (<- カタカナの部分は実際には半角です)
というフォルダ名になってしまい、アクセスできなくなります。

webフォルダ上で新しいフォルダを作成したとき、
/var/log/httpd/error_logは次のメッセージを出力しました。
config_merge: entered
merged: enable_function == 2
merged: strip_msaccount == 2
merged: server_encoding == EUC-JP
config_merge: entered
merged: enable_function == 2
merged: strip_msaccount == 2
merged: server_encoding == EUC-JP
config_merge: entered
merged: enable_function == 2
merged: strip_msaccount == 2
merged: server_encoding == EUC-JP
[Tue Sep 17 19:32:19 2002] [warn] mod_enc_convert: no conversion done
config_merge: entered
merged: enable_function == 2
merged: strip_msaccount == 2
merged: server_encoding == EUC-JP
config_merge: entered
merged: enable_function == 2
merged: strip_msaccount == 2
merged: server_encoding == EUC-JP
[Tue Sep 17 19:32:19 2002] [warn] mod_enc_convert: no conversion done
config_merge: entered
merged: enable_function == 2
merged: strip_msaccount == 2
merged: server_encoding == EUC-JP

サーバ上では文字化けしたディレクトリができていました。
そのディレクトリ名はShift-JISの文字コードで「新しいフォルダ」
となっていました。

tcpdumpで通信を見てみたのですが、Windows2000のwebフォルダは
UTF-8で(mimeencodeして)フォルダ名をサーバに渡していました。

サーバはなぜかShift-JISに変換しているようです。
(mod_encodingがやっているのか、mod_davがやっているのかは分かりません。)

webフォルダの情報を更新すると、サーバはShift-JISのディレクトリ名を
UTF-8に変換せずにそのまま(mimeencodeして)渡していました。

サーバ上でEUC-JPで書かれているファイル名も
UTF-8に変換せずにそのまま渡していました。

httpd.confのDavServerEncoding、SetServerEncodingともに
EUC-JPにしています。

なんでShift-JISに変換されるのか分からず、どうしようも無い状態です。
コンパイルが上手くいかなかったのでmod_davを勝手にいじったのが原因でしょうか。

以下に私の環境と構築までにやってきたことを延々と書きます。
他にも足りない情報がありましたら言って下さればすぐ用意します。

長文失礼しました。


[環境]
VineLinux2.1.5を、VineSeedにアップグレード
glibc-2.2.4
apache-1.3.26
expat-1.95.2

[WebDAV構築までにやってきたこと]
mod_encoding-20020611a.tar.gzを展開して
mod_encoding-20020611a/libに入り
$ ./configure
(略)
hecking whether to use iconv(3) as a fallback converter... yes
checking for iconv.h... yes
checking for iconv in -liconv... no
checking for libiconv in -liconv... no
(略)
コンパイルしてインストールしました。
$ make && su make install

次にmod_encoding-20020611aで
$ ./configure --enable-debug --with-iconv-hook
(略)
checking whether to enable maintainer-specific portions of Makefiles... no
checking whether to compile with debug code... yes
checking whether to wrap iconv with iconv_hook... yes
checking for iconv_hook in -liconv_hook... yes
checking for iconv in -liconv... no
checking for libiconv in -liconv... no
(略)
$ make

出来たmod_encoding.soを/etc/httpd/modules/にコピーしました。
# cp mod_encoding.so /etc/httpd/modules/

次にmod_dav-1.0.3-1.3.6.tar.gz を展開し
patch -p0 < mod_dav-1.0.3-1.3.6-l10n.diff しました。

んで mod_dav-1.0.3-1.3.6 に入り
$ ./configure
(略)
checking for static Apache module support... no
checking for dynamic Apache module support (via APXS)... found at /usr/sbin/apxs
checking for expat... found in /usr/include/apache
(略)
makeすると、

(略)
gcc -shared -o libdav.so dav_props.o dav_util.o dav_xmlparse.o mod_dav.o dav_lock.o dav_opaquelock.o dav_dyn.o iconv_hook_default.o iconv_hook_ja_auto.o iconv_hook_mssjis.o identify_encoding.o dav_fs_dbm.o dav_fs_lock.o dav_fs_repos.o sdbm/sdbm.o sdbm/sdbm_hash.o sdbm/sdbm_lock.o sdbm/sdbm_pair.o
gcc: iconv_hook_default.o: そのようなファイルやディレクトリはありません
gcc: iconv_hook_ja_auto.o: そのようなファイルやディレクトリはありません
gcc: iconv_hook_mssjis.o: そのようなファイルやディレクトリはありません
gcc: identify_encoding.o: そのようなファイルやディレクトリはありません
apxs:Break: Command failed with rc=1
make: *** [libdav.so] エラー 1

となったので、mod_encoding-20020611a/libから
cp.h
iconv_hook.c
iconv_hook.h
iconv_hook_default.c
iconv_hook_ja_auto.c
iconv_hook_mssjis.c
identify_encoding.c
identify_encoding.h
をコピーしてきて、もう一度makeすると、コンパイルが通りました。

libdav.soを/etc/httpd/modules/にコピーしました。
# cp libdav.so /etc/httpd/modules/

/etc/httpd/conf/httpd.confには次の設定を書き加えました

# /etc/httpd/conf/httpd.conf ここから
LoadModule dav_module modules/libdav.so
AddModule mod_dav.c

LoadModule encoding_module modules/mod_encoding.so
AddModule mod_encoding.c

<IfModule mod_headers.c>
 Header add MS-Author-Via "DAV"
</IfModule>

DavServerEncoding EUC-JP
DAVLockDB /var/apache/DAVLock

<IfModule mod_encoding.c>
 EncodingEngine    on
 NormalizeUsername on
 SetServerEncoding     EUC-JP

 DefaultClientEncoding JA-AUTO-SJIS-MS SJIS
 AddClientEncoding "cadaver/" EUC-JP
</IfModule>

<Location /DAV>
 DAV On
</Location>
# /etc/httpd/conf/httpd.conf ここまで

/etc/init.d/httpd startすると次のようなエラーメッセージが出ました。
Cannot load /etc/httpd/modules/libdav.so into server: /etc/httpd/modules/libdav.so: undefined symbol: iconv_hook_eucjp_init

このエラーを解消するために、Makefile.inを次のように修正し、
--- Makefile.in.orig    Tue Sep 17 18:57:01 2002
+++ Makefile.in Tue Sep 17 18:58:25 2002
@@ -31,7 +31,11 @@
        iconv_hook_default.c \
        iconv_hook_ja_auto.c \
        iconv_hook_mssjis.c \
-       identify_encoding.c
+       identify_encoding.c \
+       iconv_hook_ucs2_cp932.c \
+       iconv_hook_eucjp.c \
+       iconv_hook_utf8_cp932.c \
+       iconv_hook_utf8_eucjp.c

 REPOS_SRCS = \
        dav_fs_dbm.c \

mod_encoding-20020611a/libから
iconv_hook_ucs2_cp932.c
ucs2_cp932.h
iconv_hook_eucjp.c
iconv_hook_utf8_cp932.c
iconv_hook_utf8_eucjp.c
をmod_dav-1.0.3-1.3.6にコピーして再度libdav.soを作り直したところ、
エラーが出ないでhttpが起動するようになりました。

windows2000のネットワークプレースの追加で
http://192.168.0.1/DAV
を追加しました。
192.168.0.1 上の DAVフォルダでファイル名がASCIIのファイルは
問題なく取り扱えることを確認しました。

が、日本語の取り扱いに関しては上に書いたとおりの状況になっています。
--
cat <cat@xxxxxxxxxxxxxxxx>