2016-12-21 24 views
0

У меня есть сценарий, который отправляет сообщения 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 

ответ

0

Вы помещаете кодирования слой UTF-8 на STDOUT, но вы не поставите этот слой на канале HL7 (независимо от того, что есть) и вы не кодируете свое сообщение в UTF-8. Вот почему вы видите предупреждение Wide print .... Запишите кодированную строку UTF-8 в соединение HL7.

my $msg = getHl7Message(); 
# $msg is not encoded. 
# map{chr}split//,$msg should produce some values larger than 255 

print($msg); 
# this is ok because the :utf8 layer was applied to STDOUT. 
# Behind the scenes, the string $msg is encoded before it is output 
# to the terminal. 

my $msgutf8 = Encode::encode("UTF-8", $msg); 
# Now $msgutf8 is a UTF-8 encoded "octet string". 
# map{chr}split//,$msgutf8 should only produce vals between 0 and 255, 
# and is safe to transmit 

my $hl7msg = new Net::HL7::Message($msgutf8); 
+0

Re "* Вы помещаете слой кодирования UTF-8 на STDOUT *", ... дважды. (Безвредный, но почему ?!) – ikegami

+0

@mob Пожалуйста, измените код на: 'my $ msgutf8 = Encode :: encode (" UTF-8 ", $ msg);', чтобы я мог принять. – GrSrv

 Смежные вопросы

  • Нет связанных вопросов^_^