2012-04-30 44 views
3

我在一個簡單的類上使用了幾個方法,這對我來說工作正常,但我注意到它們真的很慢由於strtr()並定義了大量的翻譯。它也很長,因此更難以保持和理解。什麼是最好的清潔字符串爲UTF-8的PHP方法/類

也就是說,所有「不好」的例子都是解決現實世界中出現的問題,將字符串轉換爲UTF8。

任何人都可以告訴我有一個衆所周知的或更有效的方式來做到這一點? (是的,我已經嘗試了正確的htmlentities()方法和iconv()方法,但也確實更換了所有時髦的人物

下面是我使用目前等級:現在 https://gist.github.com/2559140

+0

你打算什麼編碼*從* – Brad

+0

我不知道有_is_一個更好的方式比你?因爲你不只是實際翻譯的字符編碼人物 - 實際上將諸如''的東西轉換爲'A',而不是從頭到尾使用utf-8(這意味着您根本不需要翻譯字符,並且可以非常高興地將'Â'留在資源)。 – CD001

+0

事實上 - 我們來自任何東西 - 因爲我們的用戶可以上傳文檔,並從其他來源獲取信息......大部分情況下,我們都是通過「iso-8859-1」和「windows-1251」獲取信息的,但是它不僅僅是字母,我們還有瘋狂的middot角色等...... – zeroasterisk

回答

2

MBSTRING的支持已啓用(但。沒有加載)在默認情況下爲PHP 5.4.0的加載擴展,這可以讓你做的事:

<? //PHP 5.4+ 
$ensureIsUTF8 = static function($data){ 
    $dataEncoding = \mb_detect_encoding(
     $data, 
     ['UTF-8', 'windows-1251', 'iso-8859-1', /*others you encounter*/], 
     true 
    ); 

    //UTF-16/32 encoding detection always fails for PHP <= 5.4.1 
    //Use detection code copied from PHP docs comments: 
    //http://www.php.net/manual/en/function.mb-detect-encoding.php 
    if ($dataEncoding === false){ 

     $UTF32_BIG_ENDIAN_BOM = chr(0x00) . chr(0x00) . chr(0xFE) . chr(0xFF); 
     $UTF32_LITTLE_ENDIAN_BOM = chr(0xFF) . chr(0xFE) . chr(0x00) . chr(0x00); 
     $UTF16_BIG_ENDIAN_BOM = chr(0xFE) . chr(0xFF); 
     $UTF16_LITTLE_ENDIAN_BOM = chr(0xFF) . chr(0xFE); 

     $first2 = \substr($data, 0, 2); 
     $first4 = \substr($data, 0, 4); 

     if ($first4 === $UTF32_BIG_ENDIAN_BOM) { 
      $dataEncoding = 'UTF-32BE'; 
     } elseif ($first4 === $UTF32_LITTLE_ENDIAN_BOM) { 
      $dataEncoding = 'UTF-32LE'; 
     } elseif ($first2 === $UTF16_BIG_ENDIAN_BOM) { 
      $dataEncoding = 'UTF-16BE'; 
     } elseif ($first2 === $UTF16_LITTLE_ENDIAN_BOM) { 
      $dataEncoding = 'UTF-16LE'; 
     } else { 
      throw new \Exception('Whoa! No idea what that was.'); 
     } 
    } 

    if ($dataEncoding === 'UTF-8'){ 
     return $data; 
    } else { 
     return \mb_convert_encoding(
      $data, 
      'UTF-8', 
      $dataEncoding 
     );  
    } 
}; 

$utf8Data = $ensureIsUTF8(\file_get_contents('something')); 
$utf8Data = $ensureIsUTF8(\file_get_contents('http://somethingElse')); 
$utf8Data = $ensureIsUTF8($userProvidedData); 
?> 
+0

看起來很性感......還沒有嘗試過,但我喜歡它的外觀。 – zeroasterisk

相關問題