Я знаю, что это было опубликовано, как год назад, но у меня есть эта проблема, и я столкнулся с этим, и на самом деле я нашел для нее решение. Этот фрагмент кода работает как прелесть!
Идея проста. Это просто помогает вам, пересчитывая длину многобайтовых строк, как указано в @Alix выше.
Несколько модификаций должны соответствовать вашему коду:
/**
* Mulit-byte Unserialize
*
* UTF-8 will screw up a serialized string
*
* @access private
* @param string
* @return string
*/
function mb_unserialize($string) {
$string = preg_replace('!s:(\d+):"(.*?)";!se', "'s:'.strlen('$2').':\"$2\";'", $string);
return unserialize($string);
}
Источник: http : //snippets.dzone.com/posts/show/6592
Протестировано на моей машине, и оно работает как шарм !!
Примечание: актуальнейшие браузеры поддерживают элементы HTML <template>
, которые обеспечивают более надежный способ повернуть элементы создания из строк. См. ответ Mark Amery ниже для деталей .
Для более старых браузеров и node/jsdom: (который еще не поддерживает <template>
элементы во время записи), используйте следующий метод. Это - то же самое использование библиотек, чтобы сделать для получения элементов DOM от строки HTML ( с некоторой дополнительной работой для IE для работы вокруг ошибок с его реализацией innerHTML
):
function createElementFromHTML(htmlString) {
var div = document.createElement('div');
div.innerHTML = htmlString.trim();
// Change this to div.childNodes to support multiple top-level nodes
return div.firstChild;
}
Примечание, что в отличие от шаблонов HTML это не будет работа для некоторых элементов, которые не могут по закону быть детьми <div>
, такой как <td>
с.
, Если бы Вы уже пользуетесь библиотекой, я рекомендовал бы придерживаться утвержденного библиотекой метода создания элементов от строк HTML:
update()
метод . jQuery(html)
и jQuery.parseHTML
методы. С Прототипом можно также сделать:
HTML:
<ul id="mylist"></ul>
JS:
$('mylist').insert('<li>text</li>');