2008-12-17 200 views
38

我的一些腳本使用不同的編碼,當我嘗試將它們合併時,這就成了一個問題。將utf8字符轉換爲iso-88591並以PHP退回

但我不能改變他們所使用的編碼,而不是我想要改變從腳本一個結果的encodig,並在腳本B.

所以用它作爲參數:有沒有簡單的方法來在PHP中將字符串從UTF-8更改爲ISO-88591?我看過utf_encode和_decode,但他們沒有做我想做的事。爲什麼不存在任何「utf2iso()」 - 函數或類似的?

我不認爲我的字符不能寫成ISO格式,所以不應該是一個大問題。

+1

utf8_decode應該是你的utf2iso?!? – BlaM 2008-12-17 13:05:45

+0

值得注意的是,PHP繼續在內部轉移到utf-8,所以任何你可能從外面輸入的字符串。設置cURL,文件訪問函數,流,PDO/MySQL或任何其他用於訪問外部數據的API以使用UTF-8,以便在PHP獲取它時已經正確。 – Xeoncross 2015-10-22 19:36:54

回答

100

看看iconv()mb_convert_encoding()。 只是順便說一句:爲什麼不utf8_encode()utf8_decode()爲你工作?

utf8_decode - 與 ISO-8859-1字符的字符串與 UTF-8爲單字節ISO-8859-1

函數utf8_encode編碼轉換 - 編碼ISO-8859- 1個 串爲UTF-8

所以基本上

$utf8 = 'ÄÖÜ'; // file must be UTF-8 encoded 
$iso88591_1 = utf8_decode($utf8); 
$iso88591_2 = iconv('UTF-8', 'ISO-8859-1', $utf8); 
$iso88591_2 = mb_convert_encoding($utf8, 'ISO-8859-1', 'UTF-8'); 

$iso88591 = 'ÄÖÜ'; // file must be ISO-8859-1 encoded 
$utf8_1 = utf8_encode($iso88591); 
$utf8_2 = iconv('ISO-8859-1', 'UTF-8', $iso88591); 
$utf8_2 = mb_convert_encoding($iso88591, 'UTF-8', 'ISO-8859-1'); 

都應該這樣做 - 與utf8_en/decode()不需要特殊擴展名,mb_convert_encoding()需要ext/mbstring和iconv()需要ext/iconv。

+0

感謝您的回答,您和其他人都是對的:utf8_decode()似乎可以完成工作。一定有一些問題與文件或我的瀏覽器。至少我不再能夠重現錯誤......(也許我在瀏覽器 - 字符集設置上做了錯誤處理?) – qualbeen 2008-12-17 19:01:14

+0

只是爲了記錄:我遇到過這樣的情況,但我注意到了iconv已被調用兩次(嵌套)到相同的str變量。在我刪除第一個電話後,就像一個魅力。 (utf8_decode和mb_convert_enconding沒有被使用) – colares 2012-06-08 21:31:03

0

您需要使用iconv包,特別是其iconv功能。

5

首先,不要使用不同的編碼。它導致一團糟,而UTF-8絕對是你應該到處使用的一個。

很可能您的輸入不是ISO-8859-1,而是別的東西(ISO-8859-15,Windows-1252)。要從這些轉換,請使用iconvmb_convert_encoding

儘管如此,utf8_encodeutf8_decode應該適用於ISO-8859-1。如果您可以發佈指向文件的鏈接或uuencodedbase64示例字符串,但轉換失敗或產生意外結果將會很好。

0

我用:

function utf8_to_html ($data) { 
    return preg_replace(
     array (
      '/ä/', 
      '/ö/', 
      '/ü/', 
      '/é/', 
      '/à/', 
      '/è/' 
     ), 
     array (
      'ä', 
      'ö', 
      'ü', 
      'é', 
      'à', 
      'è' 
     ), 
     $data 
    ); 
} 
0

我用這個函數:

function formatcell($data, $num, $fill=" ") { 
    $data = trim($data); 
    $data=str_replace(chr(13),' ',$data); 
    $data=str_replace(chr(10),' ',$data); 
    // translate UTF8 to English characters 
    $data = iconv('UTF-8', 'ASCII//TRANSLIT', $data); 
    $data = preg_replace("/[\'\"\^\~\`]/i", '', $data); 


    // fill it up with spaces 
    for ($i = strlen($data); $i < $num; $i++) { 
     $data .= $fill; 
    } 
    // limit string to num characters 
    $data = substr($data, 0, $num); 

    return $data; 
} 


echo formatcell("YES UTF8 String Zürich", 25, 'x'); //YES UTF8 String Zürichxxx 
echo formatcell("NON UTF8 String Zurich", 25, 'x'); //NON UTF8 String Zurichxxx 

看看我的功能在我的博客 http://www.unexpectedit.com/php/php-handling-non-english-characters-utf8

-1
function parseUtf8ToIso88591(&$string){ 
    if(!is_null($string)){ 
      $iso88591_1 = utf8_decode($string); 
      $iso88591_2 = iconv('UTF-8', 'ISO-8859-1', $string); 
      $string = mb_convert_encoding($string, 'ISO-8859-1', 'UTF-8');  
    } 
} 
1

設置在頭meta標記爲

<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" /> 

使用鏈接http://www.i18nqa.com/debug/utf8-debug.html替換您想要的符號字符。

然後使用str_replace函數像

$find = array('“', '’', '…', 'â€」', 'â€「', '‘', 'é', 'Â', '•', 'Ëœ', 'â€'); // en dash 
         $replace = array('「', '’', '…', '—', '–', '‘', 'é', '', '•', '˜', '」'); 
$content = str_replace($find, $replace, $content); 

它我使用的方法和很多幫助。謝謝!

0

在我的情況下,上傳包含這些字符的名稱的文件後,它們甚至不能在Filezilla中看到!在Cpanel文件管理器中,它們顯示的是? (在黑色背景下)。 而這種組合使得它正確地顯示在瀏覽器(HTML文檔是西方編碼):

$dspFileName = utf8_decode(htmlspecialchars(iconv(mb_internal_encoding(), 'utf-8', basename($thisFile['path'])))); 
0

最好就是使用

$值= mb_convert_encode($值,「HTML實體」 , 'UTF-8');

特別是當您使用AJAX調用提交'ISO-8859-1'字符時。它適用於中文,日文,捷克文,德文和更多語言。

0

使用html_entity_decode()htmlentities()

$html = html_entity_decode(htmlentities($html, ENT_QUOTES, 'UTF-8'), ENT_QUOTES , 'ISO-8859-1'); 

htmlentities()格式化你的投入UTF8html_entity_decode()格式回ISO-8859-1