У меня есть сценарий, который отправляет сообщения HL7 в Mirth. Вот программа:Perl: символы UTF8 искажаются при передаче
use Net::HL7;
use Net::HL7::Connection;
use open (":encoding(UTF-8)", ":std");
binmode(STDOUT, ":utf8");
my $conn = new Net::HL7::Connection('127.0.0.1', 7010);
my $msg = getHl7Message(); # Too many things happening in getHl7Message()
print($msg) # All characters are correct in $msg when printed
my $hl7msg = new Net::HL7::Message($msg);
print($hl7msg->toString(1)) #All characters are correct
my $response = $conn->send($hl7msg); #sent to Mirth
Теперь, когда я проверяю веселье, все символы вне набора ASCII искажаются.
Что мне делать? Net :: HL7 :: Connection использует IO :: Socket внутри.
Я также получаю это предупреждение: Wide character in print at /usr/local/share/perl5/Net/HL7/Connection.pm line 143.
Я попытался выполнить с -CS, но все равно не получил.
Некоторая информация:
[[email protected] gs]$ lsb_release -a
LSB Version: :base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch
Distributor ID: OracleServer
Description: Oracle Linux Server release 6.6
Release: 6.6
Codename: n/a
/и т.д./окружающей среды и/и т.д./по умолчанию/локаль была пуста. Я добавил эти две линии
LC_ALL=en_US.UTF-8
LANG=en_US.UTF-8
Результат:
[[email protected] gs]$ locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=en_US.UTF-8
Re "* Вы помещаете слой кодирования UTF-8 на STDOUT *", ... дважды. (Безвредный, но почему ?!) – ikegami
@mob Пожалуйста, измените код на: 'my $ msgutf8 = Encode :: encode (" UTF-8 ", $ msg);', чтобы я мог принять. – GrSrv