2010-11-21 2 views
0

Я сделал следующие вещи:PHP htmlspecialchars() ошибка функции при попытке использовать UTF-8 строку

  1. У меня есть таблица с данными. Одна из строк имеет в ней символ ü.
  2. Я сохраняю это как файл CSV в OpenOffice.org. Когда он спрашивает меня о кодировке символов, я выбираю UTF-8.
  3. Я использую Navicat для создания таблицы базы данных MySQL, InnoDB с UTF-8 utf8_general кодирования и импорта CSV.
  4. Я пытаюсь использовать функцию PHP htmlspecialchars($string, ENT_COMPAT, 'UTF-8') где $string - это строка, содержащая специальный символ ü.

Это дает мне ошибку: Неверная последовательность многобайтов в аргументе. Когда я меняю 'UTF-8' с 'ISO8859-1', ошибка не выдается, но отображается неправильный символ. (Символ «неизвестный символ» выглядит как <?>)

Если я использую HTML-форму для обновления строки в базе данных, ошибка исчезает, и символ отображается правильно, однако, когда я затем смотрю на запись в Navicat, это выглядит два символа:

[1/4][A with some thing on top of it]

Некоторые многобайтовая, не рассматривается как один из character.`

что происходит, где все идет не так, и что я могу с этим поделать ?

ответ

2

Хотя я не понимаю, где ошибка «неверный многобайтный» приходит, я уверен, что htmlspecialchars() является not your culprit:

For the purposes of this function, the charsets ISO-8859-1, ISO-8859-15, UTF-8, cp866, cp1251, cp1252, and KOI8-R are effectively equivalent, as the characters affected by htmlspecialchars() occupy the same positions in all of these charsets.

В моем понимании, htmlspecialchars() должно работать нормально для строки UTF-8 без указания набора символов. Моя ставка будет заключаться в том, что либо HTML-страница, содержащая форму, либо соединение с базой данных, которое вы используете, не кодируется в кодировке UTF-8. Для последнего попробуйте отправить

SET NAMES utf8; 

на mySQL перед тем, как сделать вставку.

+0

Согласно основному журналу запросов mysql, 'SET NAMES utf8' фактически отправляется на сервер MySQL. Хотя в этом процессе нет формы (есть один, когда я обновляю запись), который установлен в UTF-8 с использованием метатега HTML. (Но опять же, ошибка уже появляется до того, как была использована форма.) –

+0

@Pelle вы можете подтвердить, что она действительно отправлена ​​на сервер * для этого соединения *? И чтобы подтвердить, что вы указываете ошибку, на самом деле вызывается 'htmlspecialchars()'? –

+0

Выяснил это. Весь материал был UTF-8, EXCEPT: соединение при использовании для выбора данных. Помещение SET NAMES UTF8 до того, как операторы select зафиксировали это. –

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