2011-03-29 47 views
2

我有一個應用程序正在採取UTF8編碼的字符,需要通過ISO-8859-1編碼通過curl作爲xml的一部分發送它們。utf8到ISO-8859-1沒有正確地轉換一些字符通過捲曲

這是我的測試代碼:

header('Content-Type: text/plain; charset=IS0-8859-1'); 

$message = '§ ° " @ # € % &/() = + ` ´^¨ * - _ : . ; ,'; 

echo mb_convert_encoding($message, 'ISO-8859-1', 'UTF-8'); 

//build xml to post 
$content = 
    '<?xml version="1.0" encoding="ISO-8859-1"?> 
    <mobilectrl_sms> 
     <header> 
      <customer_id>'.CUSTOMER_ID.'</customer_id> 
      <password>'.PASSWORD_ID.'</password> 
     </header> 
     <payload> 
      <sms account="'.SHORT_CODE.'"> 
       <message><![CDATA['.mb_convert_encoding($message, 'ISO-8859-1', 'UTF-8').']]></message> 
       <to_msisdn>+12345678900</to_msisdn> 
      </sms> 
     </payload> 
    </mobilectrl_sms>'; 

$posturl = MT_URL; 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $posturl); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_HTTPHEADER, Array("Content-Type: text/xml", "Content-length: ".strlen($content), "charset=ISO-8859-1")); 
curl_setopt($ch, CURLOPT_HEADER, 0); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $content); 
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 
$response = curl_exec($ch); 

在它幾乎工作的瀏覽器,我看§°「@#%& /()= +`」^¨* - _:;?,

通知的歐元符號€

但是,當涉及通過文本消息我看到 §?「@#? %& /()= +? ? ^? * - _:。 ; ,

我想不出來,我也嘗試過utf8_decode,但這似乎使情況變得更糟。我錯過了什麼嗎?

感謝

回答

3

有一個在ISO-8859-1沒有歐元符號,所以它被用問號代替。除了選擇別的東西來代替它之外,你無能爲力。

對於轉換爲? s的其他字符也是如此。

+1

這就是爲什麼ISO-8859- *被認爲是遺留問題,而UTF-8/16被認爲是現有標準中明智和現代的選擇。 – Quentin 2011-03-29 15:51:18

+0

感謝您的回答,我將不得不考慮將這些角色轉換爲接近的東西。它的短信應用程序,顯然很多運營商GSM仍然使用iso-8859,這是在歐洲!我猜沒有人可以給歐元符號發短信。 – bones 2011-03-31 19:37:55

4

AFAIK,多字節擴展不知道如何音譯字符如歐元符號,但iconv()確實(從http://php.net/function.iconv#example-2228例如代碼):

<?php 
$text = "This is the Euro symbol '€'."; 

echo 'Original : ', $text, PHP_EOL; 
echo 'TRANSLIT : ', iconv("UTF-8", "ISO-8859-1//TRANSLIT", $text), PHP_EOL; 
echo 'IGNORE : ', iconv("UTF-8", "ISO-8859-1//IGNORE", $text), PHP_EOL; 
echo 'Plain : ', iconv("UTF-8", "ISO-8859-1", $text), PHP_EOL; 

以上例程的輸出類似於:

Original : This is the Euro symbol '€'. 
TRANSLIT : This is the Euro symbol 'EUR'. 
IGNORE : This is the Euro symbol ''. 
Plain : 
Notice: iconv(): Detected an illegal character in input string in .\iconv-example.php on line 7 
This is the Euro symbol ' 

請注意使用iconv("UTF-8", "ISO-8859-1//TRANSLIT", $text)將'€'字符音譯爲其'EUR'的Latin-1「equivalent」。

1

某些SMS協議接受歐元符號的「%80」。因此,您可以嘗試用「%80」代替「€」,並使用ISO-8859-1對字符串的其餘部分進行URL編碼。它適用於我的一些SMS協議。