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

syk*_*ker 0 perl berkeley-db

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

jro*_*way 6

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

您收到的警告表明Perl正在为您进行转换,并且正在猜测您要使用的字符编码.因为它可能会猜错,所以最好明确说出来.Encode模块允许您这样做.

而不是写:

$db->store( key => $value );
Run Code Online (Sandbox Code Playgroud)

你应该写:

use Encode qw(encode);

$db->store( key => encode('utf-8', $value) );
Run Code Online (Sandbox Code Playgroud)

在出路上:

use Encode qw(decode);

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

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