2010-06-19 24 views
0

我最近與朋友一起完成的一個網站上有一個可以上載圖像和文本文件的圖庫。唯一可接受的文本文件(以簡化開發)是.txt和正常熄滅順利(或不..)在文件上傳中處理擴展ASCII

我遇到的問題是一樣的,任何開發人員的:微軟的擴展ASCII。

從文件輸出文本之前,我去了幾個不同的層,試圖把它清理乾淨:

$txtfile = file_get_contents(".".$this->var['submission']['file_loc']); 

// BOM Fun 
    $boms = array 
    (
     "utf8" => array(3,pack("CCC",0xEF,0xBB,0xBF)), 
     "utf16be"  => array(2,pack("CC",0xFE,0xFF)), 
     "utf16le"  => array(2,pack("CC",0xFF,0xFE)), 
     "utf32be"  => array(4,pack("CCCC",0x00,0x00,0xFE,0xFF)), 
     "utf32le"  => array(4,pack("CCCC",0xFF,0xFE,0x00,0x00)), 
     "gb18030"  => array(4,pack("CCCC",0x84,0x31,0x95,0x33)) 
    ); 
    foreach($boms as $bom) 
    { 
     if(mb_substr($txtfile,0,$bom[0]) == $bom[1]) 
     { 
      $txtfile = substr($txtfile,$bom[0]); 
      break; 
     } 
    } 
$txtfile_o = $txtfile; 
$badwords = array(chr(145),chr(146),chr(147),chr(148),chr(151),chr(133)); 
$fixwords = array("'","'",'"','"','-','...'); 
$txtfile_o = str_replace($badwords,$fixwords,$txtfile_o); 
$txtfile_o = mb_convert_encoding($txtfile_o,"UTF-8"); 

的str_replace函數是將微軟的可怕的智能引號,破折號的一般方法,以及省略號轉換爲它們的正常ASCII等值用於輸出。

此代碼的工作完全是上傳的文件是ANSI/US-ASCII的情況下找到。

此代碼不能正常工作(沒有特殊原因)時,上傳的文件是UTF-8。

當該文件是UTF-8,查看文件本身在網絡瀏覽器工作正常,但打印出來通過使用此代碼的Web界面不。在這種情況下,這些巧妙的語錄變成某種角色的重音。

這是我卡住的地方。網頁的輸出編碼是UTF-8,網頁瀏覽器將其視爲UTF-8,文件使用UTF-8,但無論是替換智能引號還是Web瀏覽器都無法正確顯示它們。

任何和所有這方面的幫助將不勝感激。

回答

1

如果我理解正確的問題是,當用戶提交的UTF-8文件的代碼替換「擴展ASCII」字符的ASCII碼同行失敗。

這是可以預料的。您不能使用在字節級操作的str_replace等等的UTF-8文件操作,而UTF-8中的字符僅由ASCII字符範圍內的字符構成一個字節。

我推薦你做的是使用一些啓發式來確定文件是否以UTF-8編碼(BOM是一種很好的方法,如果你確定它會存在的話)或Windows-1252或其他什麼,然後將其轉換爲UTF-8,如果它不是。在這種情況下,你不需要替換任何字符,你可以保留聰明的引號。

+0

問題是,mb_convert($ string,「UTF-8」);如果你傳遞一個UTF-8字符串的話,實際上會把語法搞砸了。它不能將UTF-8轉換爲UTF-8而沒有可怕的結果。 – Navarr 2010-06-23 23:14:05

0

您試圖替換的字符在UTF8中具有不同的字節值。實際上,它們在UTF8中有多個字節。您正嘗試使用Windows編碼值搜索它們,這就是爲什麼您找不到它們的原因。

中查找字符的UTF8字節序列,並將其用於搜索。