2015-02-05 63 views
0

我是編碼新手,所以請耐心等待。 我正在一個用戶上傳csv的系統上工作,我需要做的是顯示內容,然後將其保存在數據庫中。 (utf-8編碼)Ÿç在csv字符不顯示php

我被要求解決一些法文字母字符顯示不正確的問題。我幾乎解決了這個問題,我顯示的字符,如

ÀàÂâÆÄäÇçÉéÈèÊêËëÎîÏïÔôœÖöÙùÛûÜüÿ

但是在標題ŸŒ提到的兩個沒有在網頁上顯示正確呢。

這是到目前爲止我的PHP代碼:

// say in the csv we have "ÖüÜߟÀàÂ" 
$content = file_get_contents(addslashes($file_name)); 
var_dump($content) // output: string(54) "���ߟ��� " 
if(!mb_detect_encoding($content, 'UTF-8, ISO-8859-1', true)){ 
    $data = iconv('macintosh', 'UTF-8', $content); 
} 
// deal with known encoding types 
else if(mb_detect_encoding($content, 'UTF-8, ISO-8859-1', true) == 'ISO-8859-1'){ 
    //$data = mb_convert_encoding($content, 'UTF-8', mb_detect_encoding($content, 'UTF-8, ISO-8859-1', true)); // does not work 
    $data = iconv('ISO-8859-1', 'UTF-8', $content); //does not work 

}else if(mb_detect_encoding($content, 'UTF-8, ISO-8859-1', true) == 'UTF-8'){ 
    $data = $content 
} 
//if i print $data "Ÿ Œ " are not printed out... they got lost somewhere 

     //do more stuff here 

我處理的文件有ISO-8859-1的編碼類型(當我打印出mb_detect_encoding($content, 'UTF-8, ISO-8859-1', true)它顯示ISO-8859-1)。

有沒有人有關於如何處理這種特殊情況的想法?

回答

3

字符Ÿ和Œ在ISO-8859-1中不可表示。看來傳入的數據實際上是windows-1252(Windows Latin 1)編碼的,因爲windows-1252在ISO-8859-1中爲控制字符保留的某些代碼位置中包含Ÿ和Œ等圖形字符。

所以你應該添加Windows-1252編碼認可的名單和治療公認的ISO-8859-1窗口1252,即使用iconv('windows-1252', 'UTF-8', $content)即使ISO-8859-1有蜜蜂的認可。錯誤標記爲ISO-8859-1的Windows-1252數據是很常見的是

+0

哇!看起來就是這樣! 如果我正確的話,windows-1252是ISO-8859-1的超集。所以即使文件真正被編碼爲ISO-8859-1 iconv('windows-1252','UTF-8',$ content)也無妨,我是否正確? 我希望...我一直在努力掙扎。我會做一些測試,然後接受答案 – mikey 2015-02-05 22:03:36

+0

技術上不是超集,但唯一的區別是範圍0x80 ... 0x9F是保留給ISO-8859-1中的控制字符(沒有指定任何特定的含義),而在windows-1252中,其中很多都被分配給可打印字符(以及其他未定義的位置)。在ISO-8859-1中實際使用控制字符的這些位置時遇到文本文件會很奇怪。更有可能的是windows-1252的意思是或者有一些處理錯誤。 – 2015-02-06 07:03:39