Почему я получаю предупреждения о широких символах от Perl, когда вставляю в Беркли DB? - PullRequest
0 голосов
/ 14 мая 2010

Я провожу эксперимент на Беркли БД. Я просто удаляю содержимое из DB a и заново вставляю пары ключ-значение в DB b. Тем не менее, я получаю ошибки широких символов при вставке пар ключ-значение в эту БД b. Помощь

1 Ответ

6 голосов
/ 14 мая 2010

BerkeleyDB хранит байты ("октеты"). Строки Perl состоят из символов Perl. Чтобы хранить символы Perl в хранилище на основе октетов, необходимо преобразовать символы в байты. Это называется кодированием, как в кодировке символов.

Предупреждение, которое вы получаете, указывает на то, что Perl выполняет преобразование для вас и угадывает, какую кодировку символов вы хотите использовать. Поскольку он, вероятно, будет угадывать неправильно, лучше прямо сказать. Модуль Encode позволяет вам сделать это.

Вместо записи:

$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; всякий раз, когда вы общаетесь по сети, через файлы, через терминал или почти все, вы должны обязательно кодировать символы в октеты на выходе и декодировать октеты в символы на входе. В противном случае ваша программа не будет работа.

...