UTF-8环境下为何需对LDAP属性值执行decode_utf8操作?
问题背景与需求
我在UTF-8环境(LC_CTYPE="en_US.UTF-8",Emacs显示"UUU")下编写了Perl程序,环境细节:
- Perl版本:5.18.2
- NET::LDAP模块版本:perl-ldap-0.44-10.3.1.x86_64
- 系统:SLES12 SP5
程序功能:读取UTF-8编码文件,插入从OpenLDAP服务器获取的部分属性值,最终将结果写入UTF-8编码文件。
当前已生效的编码设置
为保证Perl内部字符串长度计算和输出文件正常,我添加了以下代码:
use utf8; use open IO => ':locale'; use open ':std' => ':locale'; use feature qw(unicode_strings);
并且在向文件句柄$fh写入前执行:
binmode $fh, ":utf8";
遇到的问题与临时解决方案
LDAP搜索($ldap->search())返回的含非ASCII字符(如德语变音符号)的属性值出现双重编码问题。例如测试用户的displayName属性,未处理时显示为Böser Umlaut im Namen,解码后才显示正确的Böser Umlaut im Namen。
目前我通过以下代码将LDAP条目转为以DN为键的哈希引用,同时完成解码:
$data{$entry->dn} = {map { $_ => [map { decode_utf8($_) } $entry->get_value($_)] } $entry->attributes(NLK_NO_OPTIONS => 1)};
该方法虽有效,但不够优雅,希望找到更合适的解决方案。
测试用LDAP用户条目
dn: uid=testuser,ou=people,dc=company,dc=org cn: User Test gidNumber: 54321 givenName: User homeDirectory: /tmp/testuser loginShell: /bin/bash sn: Test uid: testuser uidNumber: 54321 objectClass: top objectClass: posixAccount objectClass: inetOrgPerson displayName:: QsO2c2VyIFVtbGF1dCBpbSBOYW1lbg==
内容的提问来源于stack exchange,提问作者U. Windl
相关产品推荐
相关产品推荐

