2011-07-22 32 views
0

我想我有一個編碼問題。我對Perl的瞭解並不多。與其他語言更好,但我已經嘗試了所有我能想到的事情,並檢查了很多其他帖子。在Perl中將變量保存到文本文件時出現損壞的西班牙字符

  1. 我正在收集姓名和地址。這可以包含非英文字符。在這種情況下西班牙語
  2. 一個php進程使用curl來執行.pl腳本並傳遞值URLEncoded
  3. .pl在.pm中執行一個函數,該函數將數據寫入文本文件。沒有涉及數據庫。

兩者。特等和.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」上解碼,但這沒有什麼區別。我保留了代碼以防萬一它有用。

感謝您的任何幫助。

+0

你怎麼知道字符被損壞?如果您使用的編輯器不支持UTF-8,則每個2字節字符將顯示爲2個垃圾字符。那是你所看到的嗎?請爲您的帖子添加示例。 –

+0

'binmode STDOUT,'utf8''做了什麼?該圖層應以冒號開頭:'binmode STDOUT,':utf8''。 (雖然這可能不會導致你的問題) – mob

+0

@ JimGarrison @ mob我希望我能夠正確地做到這一點。第一次使用stackoverflow和發現後/評論過程有點混亂。 Jim回答你的問題,我可以在Linux上使用vi來查看創建的文件,並顯示錯誤的字符。然後我可以使用vi來完美地添加西班牙文字符。我甚至不需要一個編輯器,只是使用「貓」來查看文件顯示損壞的characters.If手動編輯然後貓完美的作品。 – Rob

回答

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編碼的表單輸入。

+0

嗨,感謝您的回答。原始的html頁面是utf8格式。但是,我並沒有設置形式的字符集。我會試試這個。 – Rob

相關問題