2013-03-26 106 views
2

背景:我有一個使用tinymce編輯HTML的網站。非破壞性空間和&x22C4;等HTML實體正在通過tinymce轉換爲UTF-8字符,即使我正在使用entity_encoding:「named」選項。然後我將它存儲在UTF-8的MySQL表中。當稍後檢索相同的HTML進行重新編輯時,多字節字符將通過tinymce分隔成單獨的字符。 Tinymce已經驗證了這是一個錯誤。tinymce的解決方法utf8 bug

現在的問題是:如何在不破壞HTML的情況下將所有多字節UTF-8字符轉換爲HTML實體?

我試圖在PHP下,但多字節UTF-8字符只是刪除:

$encoded_string = htmlentities($utf_string, ENT_HTML5, 'UTF-8', false); 
$html_ent_conv = htmlspecialchars_decode ($encoded_string , ENT_COMPAT | ENT_HTML5); 

我也試過mb_encode_numericentity,但我想不出我應該用什麼爲convmap參數。

更新:我有PHP 5.3.17,它不支持ENT_HTML5,所以我刪除它。現在它適用於非破壞性空間,但不適用於其他多字節UTF-8字符。

回答

0

幾年前,我遇到了這段代碼的PHP文件中:

function utf8_to_html($data) 
{ 
    return preg_replace("/([\\xC0-\\xF7]{1,1}[\\x80-\\xBF]+)/e", '_utf8_to_html("\\1")', $data); 
} 

function _utf8_to_html($data) 
{ 
    $ret = 0; 

    foreach((str_split(strrev(chr((ord($data{0}) % 252 % 248 % 240 % 224 % 192) + 128) . substr($data, 1)))) as $k => $v) 
    $ret += (ord($v) % 128) * pow(64, $k); 

    return "&#$ret;"; 
} 

出去,再次發現了它:中保存的

http://php.net/manual/en/function.utf8-decode.php

燦爛小片段我培根有幾次。