前回の記事では属性に空の数値があると、配列上ずれてno values for attributeエラーになってしまったということですが、今回はOpenLDAPにadd/replaceされた属性の値が日本語の場合に文字化けしてしまうという課題の解決について記載しています。
前提:
- Perlスクリプトの内部文字コードはutf8
- 受け取るデータの文字コードもutf8
- LDAPサーバーはCentOS上に構築されたOpenLDAP
- LDAPサーバー(OpenLDAP)へのBINDはSimple Bind
以下のコードの場合、errorMessageは空で返るし、returnCodeも0で返ってくる。
しかし、OpenLDAPに登録されたのはApache Directory Studioで見ても文字は化けしているし、参照するためのWeb画面でも文字化けしてしまう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
use utf8; use Net::LDAP; use CGI; $q = new CGI; print $q->>header({ -charset=>"utf-8", -type=>"application/json" }); $ldapInfo = setLDAPInfo(); $cn = $q->param('cn'); $dn = setDN($cn); #dnをセットするサブルーチン $attr = $q->param('attr'); $value = $q->param('value'); $event = $q->param('event'); #add or replace $ldap = Net::LDAP->new("$ldapInfo->{'server'}"); $return = $ldap->bind("$ldapInfo->{'user'}",password=>"$ldapInfo->{'pass'}",version=>3); $result = $ldap->modify( $entry, $event => { $attr => $val } ); $ldap->unbind(); $response->{'errorMessage'} = $result->{'errorMessage'}; $response->{'returnCode'} = $result->{'returnCode'}; print to_json($response); |
もろもろ試したり、調べたりした結果、OpenLDAPは基本的に文字をISO-8859-1で保存しているようで、以下のようにスクリプト内でISO-8859-1にEncodeすることで文字化けを回避できるようになった。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
use utf8; use Encode; use Net::LDAP; use CGI; $q = new CGI; print $q->>header({ -charset=>"utf-8", -type=>"application/json" }); $ldapInfo = setLDAPInfo(); $cn = $q->param('cn'); $dn = setDN($cn); #dnをセットするサブルーチン $attr = $q->param('attr'); $value = $q->param('value'); encode('ISO-8859-1',$value); $event = $q->param('event'); #add or replace $ldap = Net::LDAP->new("$ldapInfo->{'server'}"); $return = $ldap->bind("$ldapInfo->{'user'}",password=>"$ldapInfo->{'pass'}",version=>3); $result = $ldap->modify( $entry, $event => { $attr => $val } ); $ldap->unbind(); $response->{'errorMessage'} = $result->{'errorMessage'}; $response->{'returnCode'} = $result->{'returnCode'}; print to_json($response); |
しかし、OpenLDAPの仕様を探してみたんだけど、ISO-8859-1で保存されるという記述が見つからず、いまさらだけどUTF-8でデータストアする方法はないのかな?と疑問がわいたので、もしかしたらいつか調べてみるかもしれない。とりあえず、今はこれで解決しているので、これで良しとしておく。