Странная проблема преобразования utf8 в php - PullRequest
0 голосов
/ 18 ноября 2009

Итак, я работаю над проектом, который берет данные из файла, в этом файле некоторые строки требуют символов utf8, но странным образом кодируются, например, они являются \ xC6, а не \ & # xC6;

Если я сделаю следующее:

$name = "\xC6ther";
$name = preg_replace('/x([a-fA-F0-9]{2})/', '&#$1;', $name);
echo utf8_encode($name);

Работает нормально. Я получаю это:

Æther

Но если я вытащу те же данные из MySQL и сделаю следующее:

$name = $row['OracleName'];
$name = preg_replace('/x([a-fA-F0-9]{2})/', '\&#$1;', $name);
$name = utf8_encode($name);

Тогда я получаю это как вывод:

\&#C6;ther

Кто-нибудь знает, почему это так?

По запросу vardump из $ row ['OracleName'];

string(15) "xC6ther Barrier" 

Ответы [ 2 ]

1 голос
/ 18 ноября 2009

на вашем втором preg_replace, почему есть \

preg_replace('/x([a-fA-F0-9]{2})/', '&#$1;', $name);

хорошо, я думаю, здесь есть некоторая путаница. ваше регулярное выражение совпадает с чем-то вроде x66 и заменит это на '& # 66', что мне кажется кодировкой html entities, но вы используете utf8_encode, которая делает это (из руководства):

utf8_encode - Кодирует строку ISO-8859-1 в UTF-8

.

чтобы вещи никогда не конвертировались ... (или, если быть более точным, '& # 66' остались бы '& # 66', так как они являются одинаковыми символами в ISO-8859-1 и UTF-8)

также следует отметить в вашем первом фрагменте, который вы используете \xC6, но preg_replace никогда не поймает это, так как это уже закодированный символ. \x означает, что следующее шестнадцатеричное число (0x00 ~ 0xFF) будет вставлено в строку как есть. не будет строки xC6

Так что я немного смущен тем, что ты действительно хочешь сделать. что такое preg_replace?

если вы хотите преобразовать сущности HTML в UTF-8, загляните в mb_convert_encoding ( manual ), если вы хотите сделать обратное, код в сущностях HTML из некоторых UTF-8 загляните в htmlentities ( руководство )

и если это не имеет ничего общего со всем этим, и вы хотите просто изменить кодировку, mb_convert_encoding все еще там.

0 голосов
/ 18 ноября 2009

Разобрался с проблемой, при извлечении SQL я пропустил 'x' в preg_replace

preg_replace('/x([a-fA-F0-9]{2})/', '&#x$1;', $name);

Как только я добавил в х, он работал как шарм.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...