Perl Unicode 羹匙书:难以驾驭库中的 Unicode 文本
℞ 42: 使用 DBM 哈希中的 Unicode 文本,麻烦的方式
虽然 Perl 5 很早就非常注意在 Perl 自身的世界中正确处理 Unicode,但每次离开 Perl 内部,你都会跨越一个需要处理解码和编码的边界。这发生在通过网络或文件执行 IO、与数据库通信或使用 XS 从 Perl 使用共享库时。
例如,考虑核心模块 DB_File,它允许你从 Perl 使用 Berkeley DB 文件——键/值对的持久存储。
使用常规 Perl 字符串作为 DBM 哈希的键或值,如果任何代码点无法放入一个字节,将触发宽字符异常。以下是手动管理转换的方法:use DB_File; use Encode qw(encode decode); tie %dbhash, “DB_File”, “pathname”;
# STORE
# assume $uni_key and $uni_value are abstract Unicode strings
my $enc_key = encode("UTF-8", $uni_key, 1);
my $enc_value = encode("UTF-8", $uni_value, 1);
$dbhash{$enc_key} = $enc_value;
# FETCH
# assume $uni_key holds a normal Perl string (abstract Unicode)
my $enc_key = encode("UTF-8", $uni_key, 1);
my $enc_value = $dbhash{$enc_key};
my $uni_value = decode("UTF-8", $enc_key, 1);
通过自己执行这种手动编码和解码,你将知道你的存储文件将具有您数据的持续表示。正确的编码当然取决于您存储的数据类型和外部代码的功能。
上一篇文章: ℞ 41: Unicode 换行
系列索引: 标准前言
标签
反馈
这篇文章有问题吗?通过在 GitHub 上打开问题或拉取请求来帮助我们。