将变量保存到Perl中的文本文件时损坏西班牙语字符

时间:2011-07-22 15:21:18

标签: perl encoding

我认为我有编码问题。我对perl的了解并不是很好。使用其他语言要好得多,但我已经尝试了所有我能想到的东西并检查了很多其他语言。

  1. 我正在收集姓名和地址。这可以包含非英文字符。在这种情况下,西班牙语。
  2. php进程使用curl执行.pl脚本并传递值URLEncoded
  3. .pl在.pm中执行一个函数,该函数将数据写入文本文件。不涉及数据库。
  4. .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 :(得分:0)

输入的编码是什么?如果输入编码不是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编码的表单输入。