2011-03-31 82 views
4

//我已在此添加新的請參閱Cheating PHP integers。任何幫助都感激不盡。我有一個想法,試圖通過將整數打包爲無符號字節來嘗試和破解數組的存儲選項(只需8或16位整數即可大大減少內存)。PHP中的字符集檢測

我目前正在自定義字符集檢測庫,並建立從Mozilla的字符集探測算法和一個伸出援助之手的chardet使用(Python的端口)的端口。但是,這在PHP中非常耗費內存(如果我只是加載了西文檢測,大約需要30mb的內存)。我已經優化了我所能做的所有工作,而無需從頭開始重新編寫以加載每一部分(這會減少內存,但會使其慢得多)。

我的問題是,你知道任何LGPL PHP庫的字符集檢測? 這完全是爲了讓研究在正確的方向上給予我一點指導。

我已經知道mb_detect_encoding的,但它遠遠太有限,與文本文件我已經帶來了太多太多的誤報(但Python的chardet的檢測它們完美)

+0

@Jase你應該上傳你的代碼,我們可以提出建議! – Yehonatan 2011-03-31 18:33:13

+0

您是否正在重新創建mbstring擴展中已存在的內容? PHP自己的mb_detect_encoding對我來說工作得很好。我用它來完成這個任務。 – Dmitri 2011-03-31 18:33:58

+1

如果您提供正確的順序或猜測,mb_detect_encoding可以很好地工作。沒有圖書館能夠100%準確地檢測到編碼。你應該可以學習關於unicode的一切,在你開始編寫任何代碼之前,先了解它。總而言之,unicode的本質是沒有辦法準確地檢測字符集,只是檢查字符串,尤其是沒有提供一些提示的短字符串。 – Dmitri 2011-03-31 18:38:36

回答

0

首先,有趣的項目,你工作!我很好奇最終產品將如何。

你看過ICU project了嗎?

+0

我對ICU項目(Java版本)進行了一番瞥見。我不是Java程序員,但我可以閱讀Java)。但選擇了chardet cus,它非常容易移植。 ICU項目與mozilla和python的chardet有什麼不同?它通常更有效率嗎? chardet是如此之重的原因是因爲它加載了大量非常大的數組用於上下文分析 – Jase 2011-03-31 18:48:17

1

我創建了一個正確編碼爲UTF-8的方法。但它是很難搞清楚什麼是當前編碼的一種,所以我來到了這個解決方案:

<?php 
function _convert($content) { 
    if(!mb_check_encoding($content, 'UTF-8') 
     OR !($content === mb_convert_encoding(mb_convert_encoding($content, 'UTF-32', 'UTF-8'), 'UTF-8', 'UTF-32'))) { 

     $content = mb_convert_encoding($content, 'UTF-8'); 

     if (mb_check_encoding($content, 'UTF-8')) { 
      // log('Converted to UTF-8'); 
     } else { 
      // log('Could not converted to UTF-8'); 
     } 
    } 
    return $content; 
} 
?> 

正如你可以看到我做一個轉換,以檢查它是否仍然是相同的(UTF-8/16),如果沒有轉換它。也許你可以使用這些代碼。

+0

嗨,感謝您的貢獻,但我的目標是創建一個包含SJIS,BIG5,UTF-8的PHP字符集檢測庫/ 16/32,iso字符集和很多更多基於上下文分析。這通常意味着,如果抓取HTTP請求不提供編碼標題或從外國上傳文本文件,我可以很好地猜測它編碼的字符集。然後我可以使用iconv或mb_convert_encoding將該字符集轉換爲UTF-8,以便於操作。它將是模塊化的,因此人們也可以自己插入。 – Jase 2011-03-31 23:11:14

+0

您提交的代碼可以創建爲模塊,但問題是它不支持流。如果使用相當大的文件,這是至關重要的 – Jase 2011-03-31 23:12:27