Испорченные испанские символы при сохранении переменных в текстовый файл в Perl - PullRequest
0 голосов
/ 22 июля 2011

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

  1. Я собираю имя и адрес. Это может содержать не английские символы. В данном случае испанский.
  2. Процесс php использует curl для выполнения сценария .pl и передает значения, кодированные URLEncoded
  3. .pl выполняет функцию в .pm, которая записывает данные в текстовый файл. База данных не задействована.

И .pl, и .pm имеют

use Encode;
use utf8;

binmode (STDIN, 'utf8');
binmode (STDOUT, 'utf8');

определено. Ниже приведена функция записи текста в файл

sub bookingCSV(@){
my $filename = "test.csv";
utf8::decode($_[1]{booking}->{LeadNameFirst});
open OUT, ">:utf8", $filename;
$_="\"$_[1]{booking}->{BookingNo}¦¦$_[1]{booking}->{ShortPlace}¦¦$_[1]{booking}->{ShortDev}¦¦$_[1]{booking}->{ShortAcc}¦¦$_[1]{booking}->{LeadNameFirst}¦¦$_[1]{booking}->{LeadNameLast}¦¦$_[1]{booking}->{Email}¦¦$_[1]{booking}->{Telephone}¦¦$_[1]{booking}->{Company}¦¦$_[1]{booking}->{Address1}¦¦$_[1]{booking}->{Address2}¦¦$_[1]{booking}->{Town}¦¦$_[1]{booking}->{County}¦¦$_[1]{booking}->{Zip}¦¦$_[1]{booking}->{Country}¦¦";
print OUT $_;
close (OUT);

Все испанские символы повреждены в текстовом файле. Я попытался декодировать одно конкретное поле "LeadNameFirst", но это не имело значения. Я оставил код на месте на случай, если он будет полезен.

Спасибо за любую помощь.

1 Ответ

0 голосов
/ 22 июля 2011

Какая кодировка входа? Если входной кодировкой не является utf-8, то вам будет бесполезно декодировать его как ввод utf-8.

Входные данные поступают из формы HTML? Тогда кодировка, вероятно, совпадает с кодировкой веб-страницы, с которой она пришла. ISO-8859-1 - это стандартная кодировка по умолчанию для американских / европейских локалей. В любом случае, как только вы обнаружите кодировку, вы можете декодировать входные данные:

$name = decode('iso-8859-1',$_[1]{booking}->{LeadNameFirst});
print OUT "name is $name\n"; # utf8 layer already enabled

Некоторые браузеры ищут и уважают атрибут accept-charset внутри тега <form>, например,

<form action="/my_form_processor.php" accept-charset="UTF-8"> 
...
</form>

Это (скрестив пальцы) приведет к тому, что вы получите ввод формы в кодировке utf-8.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...