> encoding_mode
> The encoding mode for the data matrix. Can be one of: AUTO
> (default), ASCII, C40, TEXT, BASE256, or NONE.Пришлось по глубже взгялуть в это дело. На питоне все из "коробки" работает нормально, но он почему оочень медленный в этом плане, да и лепить костыль для вызова скрипта рисования Честного знака из питона не хотелось (да и в моем случае SVG лучше, чем PNG).
Тут дело в другом.
Вся эта кодировка тут до лампочки. Если посмотреть исходный код, то увидим, что режимы ASCII, C40, TEXT, BASE256 проходит через такую вещь, как scalar ... Единственный режим, который нормально пропускает, это NONE. Но тут возникает другая проблема. ASCII коды меньше, чем 127, модуль почему-то уменьшает на единицу и чтобы правильно все отображалась, к этим кодам нужно добавить 1. В результате будет что-то типа такого:
use CGI;
use HTML::Barcode::DataMatrix;
my $q = CGI->new;
print $q->header(-type => 'text/html', -charset => 'utf8');
# Честный знак
my $dt = '0102900806230022215TIWUQTEMgnps91EE1092RqSDLGNvKnc4/0rc3+/ddq4XCNVpDMqmew/WcgmOKkE=';
my @array = unpack( "C*", $dt );
$dt='';
$dt .= chr(++$array[$_]) for (0..$#array);
# FNC1 - chr(232), GS должен быть chr(29), но здесь ставим chr(30)
my $barcode = HTML::Barcode::DataMatrix->new(text => chr(232) . substr($dt, 0, 31) . chr (30) . substr($dt, 31, 6) . chr (30) . substr($dt, 37), encoding_mode => 'NONE', module_size => "2px");
print $barcode->render;
Берем любую программу, например, Честный знак.Бизнес, проверяем и все путем.