2016-02-02 4 views
2

Я делаю форму с текстом ввода.Преобразование строки Юникода в строку PHP utf8

<input type="text" id="input" value=""/> 

я получил UTF-8 строку из Интернета, как это (с JavaScript, JQuery)

var str = '\u306e\u7c21\u5358\u306a\u8aac\u660e'; 

ул является "の 簡 単 な 説明.

набор входного значения поля к «ул»

$('#input').val(str); 

этот входной заменить все убегания строки «\» и заданной строки, как это.

<input type"text" id="input" value="u306eu7c21u5358u306au8aacu660e"/> 

проблем нет в этом пункте. дисплей знак тоже хорошо.

enter image description here

Но.

Когда я сохранить эту строку в моей базе данных с PHP

PHP поместить это значение не маскирование utf8 строка «u306eu7c21u5358u306au8aacu660e» в базе данных

и в следующий раз я называю

<input type="text" id="input" value="<?=$str?>"> 

и браузер отображает необработанное значение

только 'u306eu7c21u5358u306au8aacu660e'

не 'の 簡 単 な 説明'

enter image description here

Я не знаю, что это неправильно.

Я попытался

$str = json_decode("\"".$str."\""); 
html_entity_decode(...); 
mb_convert_encoding(...); 

, но не работает правильно ...

Как я могу тайный эту неоднозначность маскирования UTF-8 строку в общую UTF-8 строку?

+0

'u306eu7c21' *** не ***« UTF-8 ». Это строка с символами «u306eu7c21». '\ u ....' - это escape-последовательность в строковых литералах Javascript/JSON, но «u306eu7c21» ничего не значит в любом контексте.Текст «の 簡 単 な 説明», закодированный в UTF-8 (и правильно интерпретированный), выглядит как «の 簡 単 な 説明», ничего больше. Не должно быть никаких расшифровки, кодирования, снятия или преобразования в любой момент. Что делать, если вы делаете все эти шаги обработки строк и просто отправляете значение как есть? – deceze

+0

@deceze Основная проблема: $ ('# input'). Val ("utf-8 encoded string") метод принудительно меняет '\ u' на 'u', а php принимает строку 'uxxxxuxxxx ....'. ответ сервера правильный. utf-8 закодированные строковые ответы типа '\ uxxxx \ uxxxx' – LaLaAsDev

+0

Я не знаю, это кажется странным. Можете ли вы опубликовать наименьший возможный пример, который воспроизводит эту проблему? Я предполагаю, что у вас буквально нет 'var str = '\ u306e ...'', вы получаете '\ u306e ...' с сервера где-нибудь (AJAX JSON?) И уже не можете его декодировать правильно или что-то. – deceze

ответ

2

У вас ДОЛЖЕН иметь поддержку MultiByte String. С некоторой дополнительной работы здесь является то, что вам нужно:

<?php 

$str = 'u306eu7c21u5358u306au8aacu660e'; 

function converter($sequence) { 
    return mb_convert_encoding(pack('H*', $sequence), 'UTF-8', 'UCS-2BE'); 
} 
# array_filter is not important here at all it just "remove" empty strings 
$converted = array_map('converter', array_filter(explode('u', $str))); 
$converted = join('', $converted); 

print $converted; 

Подобно тому, как сторона, обратите внимание, вы должны найти лучшую стратегию для того, чтобы разделить Юникода последовательности. Под «взрывающейся» строкой на u знак несколько ingenuo.

Кроме того, я настоятельно советую вам прочитать превосходное сообщение в блоге Армина Ронахера, UCS vs UTF-8 as Internal String Encoding.

+0

Обратите внимание, что вам следует избегать отправки мусора, такого как «u306e», на ваш сервер. Ваше решение работает, если вы не можете исправить отправку, но вам не следует использовать это как последнее средство. – deceze

+0

Спасибо. но почему javascript $ ('# ..'). val (...) преобразует строку utf8 в неэкранированную строку? – LaLaAsDev

+0

@deceze yep! На самом деле лучше установить правильную кодировку в базе данных, сохранить значение как есть. – felipsmartins

Смежные вопросы