[Message Prev][Message Next][Thread Prev][Thread Next][Message Index][Thread Index]

Re: UTF-8 のプロセス呼び出しで文字化け



白井です。

# ldapsearch を動かす話ピンポイント

From: Mimpei MORISHITA <mimpei@xxxxxxxxx> さん曰く
Subject: Re: UTF-8 のプロセス呼び出しで文字化け
Message-ID: <20060127.181312.01364700.mimpei@xxxxxxxxx>
Date: Fri, 27 Jan 2006 18:13:12 +0900 (JST)

> > で、森下さんのやろうとしてる目的によるのですが、コマンドライン引数に
> > utf-8を渡す必要は本当にあるのですか?
> > 上記の理由でmeadowからだけでなく、コマンドライン引数を正しく受け取れないため、
> > たいていのプログラムは受け取れないしそのようなつくりにはなっていないと思います。
> 
> 実際にやりたいことは、LDAP による日本語検索です。

> mew-ldap.el からも、引数を utf-8 にすれば「森」は OK だが「森下」は NG
> でした。

> # 部署から検索する場合、当方の環境には日本語レコードしかないので。
> Cygwin 版 ldapsearch コマンドの引数に、検索条件を utf-8 で渡せば結果が
> 返ってくるというのは確認しています。

そういうときは、utf-8 を encode したものを ldapsearch に渡せばよ
いのでは?と思います。

ぼくは Meadow だと netscape の ldapsearch を使っているのですが、
うちの会社の ldap のデータがへろへろでして、名前のカタカナ読み
(しかも姓と名の間に全角スペースが必要)でしか検索できません。

# しかも シュトウ、シユトウ みたい小さい文字の登録が人によって違
# うし、最初は信じられなかったのよ。

そういうめちゃくちゃ特殊な社内環境向けに mew-ldap.el を自分で大
改造しています。いろいろとありまして、改造した mew-ldap.el その
ままは出せません(というかおそらく普通は無意味なコードだらけ)が、

mew-ldap-make-filter で

(defun encode-ldap-utf8 (string)
  (let* ((utf8 (encode-coding-string string 'utf-8))
	 (len (length utf8))
	 (i 0)
	 ret)
    (while (< i len)
      (setq ret (concat ret (format "\\%02x" (aref utf8 i))))
      (setq i (1+ i)))
    ret))

なフィルタをかますと、

(encode-ldap-utf8 "シライ ヒデユキ")
=> "\\e3\\82\\b7\\e3\\83\\a9\\e3\\82\\a4\\e3\\80\\80\\e3\\83\\92\\e3\\83\\87\\e3\\83\\a6\\e3\\82\\ad"
となり

("-h" "へんな ldap server の FQDN" "-p" "389" "-b" "c=jp" "(cn=\\e3\\82\\b7\\e3\\83\\a9\\e3\\82\\a4\\e3\\80\\80\\e3\\83\\92\\e3\\83\\87\\e3\\83\\a6*)" "title" "ou" "givenname" "sn" "mail" "cn")

という encode した検索パターンが得られるようにしています。おそら
く、こうやれば森下さんも検索できるのじゃないかな?と思いますよ。

(encode-ldap-utf8 "森下") => "\\e6\\a3\\ae\\e4\\b8\\8b" ですね。

mew-ldap.el で対応するなら、mew-ldap-make-filter() で ascii じゃ
なかったらこうやる、とかすれば良いのかな。

-- 
白井秀行 (mailto:shirai@xxxxxxxxxxx)

# うちのグループの会社の人ならそのまま差し上げても良いのですが ^^;;;
## To: の後に日本語書いて補完はいやなので、ローマ字変換とかいろ
## いろやっています。