2011-07-14 31 views
0

我試圖從CSV文件導入數據到使用utf-8編碼的web應用程序。我正在使用fgetcsv(我不必如果有更好的方法)。我正在使用utf8_encode來嘗試從文件的編碼轉換字符。當我對來自這個特定文件的字符串調用mb_check_encoding時,我得到'ASCII'。PHP - fgetcsv - 在UTF-8編碼的web應用程序中輸入引號丟失

輸入中有一些奇怪的字符。 utf8_encode愉快地處理é字符(在它們以黑鑽石問號出現之前)。但是,它不能翻譯雙引號和撇號,而只是刪除它們。

非常感謝,謝謝。我使用CakePHP,以防給我更多選擇!

編輯 - 我的意思是utf8_encode,而不是utf8_decode。

+1

如果您的應用程序使用UTF-8,爲什麼要將文本轉換爲latin1(這是utf8_decode的作用)? –

+0

有沒有處理編碼的神奇功能!您需要*知道*輸入的編碼,並將其適當地轉換爲您的首選編碼。 Automagic字符集檢測和轉換根本不起作用。 – deceze

+0

那麼,你輸入的編碼是什麼? – deceze

回答

1

對於$in_charset參數,只需要使用正確的字符集即可調用iconv

$utf8Text = iconv($inputCharset, 'UTF-8', $text); 

您需要知道輸入的字符集。沒有辦法繞過它。制定一個規範,所有的輸入需要在ISO-8859-1,或任何你喜歡的。或者,找出你輸入的字符集是什麼(問問作者,在編輯器中測試你自己)。或者,要求輸入需要以某種方式指定它在某處的編碼。

編碼不是黑魔法。您只需要瞭解某些文本的編碼方式以及您希望編碼的編碼方式。然後使用iconv這樣的函數,可以將字符從一種編碼轉換爲另一種編碼。 utf8_encodeutf8_decode在ISO-8859-1和UTF-8之間轉換。他們的名字非常可怕,因爲他們建議他們可以自動將任何內容翻譯成UTF-8,但事實並非如此。

+0

謝謝。這已經爲我清除了一些事情。我有點認爲utf8_encode只需要任何東西並返回utf8輸出(就像你說的)。我現在使用iconv('Windows-1252','UTF-8',$ text),現在所有角色都正確處理。 – Will

+0

@很高興你看到了燈。 :O) – deceze

1

可以通過使用下面的函數確定的奇怪的字符的問題:

function htmlallentities($str){ 
    $res = ''; 
    $strlen = strlen($str); 
    for($i=0; $i<$strlen; $i++){ 
    $byte = ord($str[$i]); 
    if($byte < 128) // 1-byte char 
     $res .= $str[$i]; 
    elseif($byte < 192); // invalid utf8 
    elseif($byte < 224) // 2-byte char 
     $res .= '&#'.((63&$byte)*64 + (63&ord($str[++$i]))).';'; 
    elseif($byte < 240) // 3-byte char 
     $res .= '&#'.((15&$byte)*4096 + (63&ord($str[++$i]))*64 + (63&ord($str[++$i]))).';'; 
    elseif($byte < 248) // 4-byte char 
     $res .= '&#'.((15&$byte)*262144 + (63&ord($str[++$i]))*4096 + (63&ord($str[++$i]))*64 + (63&ord($str[++$i]))).';'; 
    } 
    return $res; 

例如,對於撇號(')1用下面的代碼片斷:

$value = "What’s your name?"; 
$value = htmlallentities(utf8_decode($value)); 
$str = "&#12287;"; 
$str2 = "'"; 
$value = str_replace($str, $str2, $value); 
$value = mysql_real_escape_string($value); 

將是很高興如果那些幫助你。

+0

你能指定這段代碼到底做了什麼嗎?只是發佈代碼,不會指定它應該做的事情,並不是很有幫助。 – deceze

+1

非常感謝。這與一個變化 - htmlallentities(utf8_decode($ value));改爲htmlallentities(utf8_encode($ value));.我不需要str_replace代碼來使它工作。萬分感謝! – Will

+0

當卷積撇號被渲染爲「tm」時,那麼我使用給定的函數來解決問題。我只是給了他一種解決方案,因爲他可以用類似的方式解決他的問題。我認爲它可以幫助他。 – 2011-07-14 09:40:36