当我插入Berkeley DB时,为什么我会从Perl获得宽字符警告?

时间:2010-05-13 22:28:41

标签: perl berkeley-db

我正在Berkeley DB上进行实验。我只是从DB a中删除内容并将键值对重新插入DB b。但是,在将键值对插入此DB b时,我收到宽字符错误。帮助

1 个答案:

答案 0 :(得分:6)

BerkeleyDB存储字节(“八位字节”)。 Perl字符串由Perl字符组成。为了在基于八位字节的存储中存储Perl字符,您必须将字符转换为字节。这称为编码,如字符编码。

你得到的警告表明Perl正在为你做转换,并猜测你想要使用什么字符编码。因为它可能会猜错,所以最好明确说出来。编码模块允许您这样做。

而不是写作:

$db->store( key => $value );

你应该写:

use Encode qw(encode);

$db->store( key => encode('utf-8', $value) );

在出路上:

use Encode qw(decode);

$db->get($key, $octets); # BDB returns the result via the arg list.  C programmers...
my $value = decode('utf-8', $octets);

这不仅仅是BDB;无论何时通过网络,通过文件,通过终端或几乎任何东西进行通信,您必须确保在出路时将字符编码为八位字节,并在途中将八位字节解码为字符。否则,您的程序将不会工作