HyperEstraierで、日本語パス、日本語ファイル名の表示が出来ず困っています。


環境:
・OS CentOS5
・サーバ文字コード EUC-JP
・Apache2.0にmod_encoding適用済み

症状:
1、estseek.confにて
   replace: ^file:///mnt/DevelopData/データシート/{{!}}http://server/DATA/DataSheet/
とした場合、検索結果には、
   file:///mnt/DevelopData/%A5%C7%A1%BC%A5%BF%A5%B7%A1%BC%A5%C8/NEC/NEC_2SK3479.pdf
 とhttp://から始まらずに、file://から始まる。

2、estseek.confにて
   replace: ^file:///mnt/DevelopData/DataSheet/{{!}}http://server/DATA/DataSheet/
とした場合、検索結果には、
   http:///mnt/DevelopData/%A5%C7%A1%BC%A5%BF%A5%B7%A1%BC%A5%C8/NEC/NEC_2SK3479.pdf
 とhttp://から始まるが、途中の日本語フォルダ名がURLエンコードされたまま
でファイルが開けない。(ファイル名が日本語の場合はファイル名もエンコード
されたまま)

回答の条件
  • 1人10回まで
  • 登録:
  • 終了:2008/01/16 17:59:28
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:i_kumagoro No.4

回答回数170ベストアンサー獲得回数58

ポイント30pt

個人的には先程の回答がヒントにならないのでしたらあきらめたほうがよいと思います。

一応estseek.cの書換え例を提示します。ただし、コンパイルが通ることは確認しましたが動作は一切確認していませんし、フォローもできません。少なくともエラーチェックがはいっていないのはよくないはずです。それから、コメント欄をオープンにすることをお勧めします。

estseek.cのshowdoc関数の先頭部分の当該部を以下に差し替え(最初から3行目以降最後から3行目までが差し替える内容)、

  int i, id, wwidth, hwidth, awidth;

  char *j,*k;
  id = est_doc_id(doc);
  if(g_showlreal){
    if(!(uri = est_doc_attr(doc, DATTRLREAL)) && !(uri = est_doc_attr(doc, ESTDATTRURI)))
      uri = ".";
  } else {
    if(!(uri = est_doc_attr(doc, ESTDATTRURI))) uri = ".";
  }
  j = cburldecode(uri, NULL);
  k=est_iconv(j, -1, "EUC-JP", "UTF-8", NULL, NULL);
  uri = k;
  free(j);

  turi = makeshownuri(uri);

showdoc関数の最後尾を以下に差し替え(2行目の追加)れば

  free(turi);
  free(k);

先程回答したような動作になる「かもしれません」。

id:masa2007_Ver2

ご指導ありがとうございます。

コメントを表示するようにしました。(知らずに設定していたみたいです・・・)

で、少し教えてほしいのですが、est_iconvの引数の意味を知りたいのですが、

googleで検索してもHitしないので、是非お願いします。(第1、3,4引数は何となく判るのですが、その他が)

で、改造後の結果としては、

①replaceにURLエンコード後のフォルダ名を設定

②英名のPDFファイルはアクセス可能。和名ファイルは相変わらずURLエンコードされたまま。

(再インデックス化は実行)

と言う状態です。

2008/01/15 18:17:53

その他の回答3件)

id:ffmpeg No.1

回答回数1202ベストアンサー獲得回数9

データの場所がapacheがアクセスできる範囲外になっているのでは。

それとローカルのURL自体がおかしいです。

http://サーバー名/~ユーザー名/.../ファイル名

とならないと。

id:masa2007_Ver2

御返答有難うございます。

データはブラウザで表示可能ですので、問題はありません。

またURLはユーザーディレクトリー配下ではありませんし、Hyperestraierのreplaceが正しく置き換え出きないのが問題なのです。

2008/01/15 09:18:55
id:i_kumagoro No.2

回答回数170ベストアンサー獲得回数58

ポイント30pt

サーバ文字コードというのは、サーバ上のファイル名が EUC-JPであるという意味でしょうか?

一応その前提で書きます。

1. は

replace: ^file:///mnt/DevelopData/データシート/{{!}}http://server/DATA/DataSheet/

ではなく、

replace: ^file:///mnt/DevelopData/%A5%C7%A1%BC%A5%BF%A5%B7%A1%BC%A5%C8/{{!}}http://server/DATA/DataSheet/

のように記述する必要があります。これは、インデックスに収録する時点で既にURLエンコードされているためです。

2. は書かれているものと異なる変換ルールが適用されているように思います。更に言えば、書かれたルールでは提示されたURLにマッチしないので適用されないと思います。

replace: ^file{{!}}http

あるいは、

replace: ^file://{{!}}http://

のようなルールがどこかにありませんか?


開けないということですが、日本語を含むファイル名を見に行ったときのapacheのログはどうなっていますか? ここがURLエンコードされたままの文字列でファイルを見に行こうとしているのであればHyper Estraierではなくapacheの問題だと思います。

id:masa2007_Ver2

返答有難うございます。

ご指摘の通り、replaceにURLエンコードされた文字列を入れる方法もあるのですが、それですとファイル名が日本語だとURLエンコードされてしまうので、無理だと思うんですよ。

NamazuのようにIndexする際に、オプション-U指定で変換せずにIndexingして、CGIからは、Apacheのmod_encodingでエンコードを指定するような方法は無いかと思いまして。

最初に書きたかったのですが、ここの文字制限で記入する事が出来なかったのです。

2008/01/15 14:53:47
id:i_kumagoro No.3

回答回数170ベストアンサー獲得回数58

ポイント30pt

mknmz -Uに相当するような事(実際に試したことはないですが、最終的に、検索結果の出力にある

<a href="...."

の部分がURLエンコードされていない状態と理解しました)は、少なくともestcmd + 標準のフィルタではできないと思います。

インデキシングの際に文書ドラフトを作れば可能かもしれませんが、実際にできるかどうか、動作に支障を来さないかどうかについてはよく分かりません。

確実なのはestseek.cを書き換えて、URLエンコードをデコード後、utf-8に変換して出力させる事でしょうか。estseek.c 内ではcburldecodeというURLエンコードをデコードする関数が使えるのでそんなに難しくはないと思います。

id:masa2007_Ver2

すいません、その辺りを少し詳しくご指導願えますでしょうか?

当方、余り知識が無いので、宜しくお願い致します。

もしくは、ヒントになるような物でも構いません、宜しくお願いします。

2008/01/15 16:25:17
id:i_kumagoro No.4

回答回数170ベストアンサー獲得回数58ここでベストアンサー

ポイント30pt

個人的には先程の回答がヒントにならないのでしたらあきらめたほうがよいと思います。

一応estseek.cの書換え例を提示します。ただし、コンパイルが通ることは確認しましたが動作は一切確認していませんし、フォローもできません。少なくともエラーチェックがはいっていないのはよくないはずです。それから、コメント欄をオープンにすることをお勧めします。

estseek.cのshowdoc関数の先頭部分の当該部を以下に差し替え(最初から3行目以降最後から3行目までが差し替える内容)、

  int i, id, wwidth, hwidth, awidth;

  char *j,*k;
  id = est_doc_id(doc);
  if(g_showlreal){
    if(!(uri = est_doc_attr(doc, DATTRLREAL)) && !(uri = est_doc_attr(doc, ESTDATTRURI)))
      uri = ".";
  } else {
    if(!(uri = est_doc_attr(doc, ESTDATTRURI))) uri = ".";
  }
  j = cburldecode(uri, NULL);
  k=est_iconv(j, -1, "EUC-JP", "UTF-8", NULL, NULL);
  uri = k;
  free(j);

  turi = makeshownuri(uri);

showdoc関数の最後尾を以下に差し替え(2行目の追加)れば

  free(turi);
  free(k);

先程回答したような動作になる「かもしれません」。

id:masa2007_Ver2

ご指導ありがとうございます。

コメントを表示するようにしました。(知らずに設定していたみたいです・・・)

で、少し教えてほしいのですが、est_iconvの引数の意味を知りたいのですが、

googleで検索してもHitしないので、是非お願いします。(第1、3,4引数は何となく判るのですが、その他が)

で、改造後の結果としては、

①replaceにURLエンコード後のフォルダ名を設定

②英名のPDFファイルはアクセス可能。和名ファイルは相変わらずURLエンコードされたまま。

(再インデックス化は実行)

と言う状態です。

2008/01/15 18:17:53
  • id:i_kumagoro
    回答4に対するコメントへのコメントです。
    est_iconv は estraier.c で定義されています。
    引数は、順に変換元の文字列、変換する(変換元の)バイト数(負数の場合は全て)、変換元のエンコード、変換後のエンコード、変換後の文字列のバイト数(を収納するポインタ)、変換できなかった文字のバイト数(を収納するポインタ)だと思います。

    replaceに指定する文字列はURLエンコードをデコードした後にutf-8に変換した文字列(のはず)です。再インデクシングは必要ありません。

    URLエンコードされたままというのは、aタグのhref属性がエンコードされたままということですか?
    (無礼を承知で書きますが)間違いなく新しくビルドしたestseek.cgiが実行されていますか?
  • id:i_kumagoro
    コメントの追加です。回答に書いた変更で、aタグのhref属性においては少なくともURLエンコードのデコードは行われるようになることを確認しました。
  • id:masa2007_Ver2
    masa2007_Ver2 2008/01/16 09:36:52
    返答が遅くなりました。
    est_iconv の御説明有難うございます。
    で、estseek.cgiですが、ビルド後にコピーするのを忘れていました(恥)
    今、コピーしてみたのですが、ファイル名やフォルダ名は日本語で表示されるようになりましたが、URL
    の先頭が依然file://から始まってしまいます。
    file:///mnt/DevelopData/データシート/xxxxx
    それと、多少文字化けが起こってるようです。

    他の方々はどうやって対処してるのでしょうか?
    Namazuよりも使い易いので、是非使用出来るようにしたいのですが、Namazuに比べて参考にする情報源が少なすぎて(泣)
    メーリングリストにも投げたのですが、全く反応無し。活動してないみたいでした。
  • id:masa2007_Ver2
    masa2007_Ver2 2008/01/16 11:36:25
    replaceの日本語フォルダ名を英名にすると、http://から始まるURLになり日本語ファイルへのアクセスも可能となりました。(サーバー管理者にお願いしてフォルダ名の変更をしてみようと思います。)

    ただ、所々日本語が化けていてアクセス出来ない状況は変わりなく、est_iconvでなのかcburldecodeなのか・・・・
    例:
    日立→ゥ優汽
    日立ディスプレイズ→椴ディスプゥぅ
    東芝→甜

    何か参考になる、または文字変換に関する情報がありましたら、ご教授お願い致します。
  • id:i_kumagoro
    そのパス名かファイル名の日立がURLエンコードされたままの場合はどのように表示されますか?
    それから、MLの投稿を見ましたが、-pc UTF-8 でインデキシングを行っているのは何故ですか?
  • id:masa2007_Ver2
    masa2007_Ver2 2008/01/16 14:42:52
    改造前のestseek.cgiを実行した場合、
    日立→%A5%A5%CD%A5%B5%A5%B9
    と表示されます。

    また、MLでは、-pc UTF-8と表記しましたが、今現在は、-pc PC932としています。
    (UTF-8なのは、参考にしたサイトからそのまま使ったからです。その後、パラメータの意味が判り色々と変更したのですが成功せず、最後に設定したPC932になったままになっています。)
    サーバ側の文字コードがEUC-JPなので、EUC-JPに変更して今再INDEXしてみます。

    で、結果なのですが、上手く表示出来るようになりました(嬉)
    そもそもの設定が違っていたのですね。
    お手数をお掛け致しました。

    色々とご指導して頂き、本当に有難うございました。
    (特にestseek.cに関しては大変勉強になりました。本業ではないのですが、色々と勉強になりました)

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません