2012-07-02 2 views
1

Я очень благодарен за помощь. Я потратил дни на эту проблему, и ни одно из предложений, которые я нашел в Интернете, похоже, не дает мне исправить.PHP - Не удается удалить странный символ

У меня есть файл CSV от поставщика. Кажется, он был экспортирован из системы Microsoft.

Я использую PHP для импорта данных в MySQL (обе последние версии).

У меня есть одна конкретная запись, которая содержит странный символ, от которого я не могу избавиться. Ручное редактирование, чтобы удалить символ, возможно, но я бы предпочел автоматическое решение, так как это произойдет несколько раз в день.

Символ представляется интерпретацией «умной цитаты». Шестигранный редактор сообщает мне, что коды символов - C2 и 92. В шестнадцатеричном редакторе это выглядит как странный A, за которым следует умная цитата. В других редакторах, Calc, Writer и т. Д. Это просто окно.メ

Я использую mb_detect_encoding для определения кодировки. Все записи в CSV-файле возвращаются как ASCII, кроме символа со странным символом, который возвращается как UTF-8. Я могу вставить запись о нарушении в MySQL, и она просто появляется в Workbench как квадрат.

Таблицы MySQL настроены на utf-8 – utf8_unicode_ci и другие необычные символы UTF (например, фракции) в порядке.

Я пробовал много решений этого ...

и др c и т. д., но ни один из них не работал для меня.

Все, что я действительно хочу сделать, это удалить или заменить оскорбительный символ, в идеале - поиск и замену шестнадцатеричных значений, но ни один из примеров, которые я пытался, не работал.

Может ли кто-нибудь помочь мне продвинуться вперед с этим, пожалуйста?

EDIT:
не можете ответить, как не хватает репутации:
Спасибо за ваш вклад. Очень признателен.
Я просто собираюсь идти с поиском шестигранного и заменить:

$DodgyText = preg_replace("/\xEF\xBE\x92/", "" ,$DodgyText); 

Я знаю, что это не элегантное решение, но мне нужно быстро исправить, и это работает для меня.

+1

'C292' является AFAIK недействительным UTF-8/код кодировки Unicode ... WTF, Microsoft? – deceze

+0

Вам не нужен preg_replace(), и я обновил свой ответ на основе фактических значений hex, которые вы нашли. –

ответ

1

С быстрым взглядом это выглядит как файл UTF-8. (UTF-8 идентичен первым 128 символам в таблице ASCII, следовательно, все обнаружено как ASCII, за исключением специального символа.)

Он должен работать, если соединение с базой данных также кодируется UTF-8 (что может не по умолчанию).

Как это сделать, зависит от вашей библиотеки базы данных, сообщите нам, какой из них вы используете, если вам нужна помощь в настройке кодировки соединения.

+0

Я использую следующее: mysql_select_db (DB_DATABASE, $ db); mysql_query ("SET NAMES 'utf8' COLLATE 'utf8_unicode_ci'"); $ result = mysql_query ($ query, $ db); –

+0

@Simon вы можете попробовать '' SET NAMES 'utf8' "' без сортировки и выполнить проверку ошибок, чтобы проверить, успешно ли выполняется запрос? –

+0

Результаты идентичны.メ остается. –

0

обновленный код на основе установленных результатов

Вы можете сделать поиск & заменить на строки, используя шестнадцатеричную нотацию:

str_replace("\xEF\xBE\x92", '', $value); 

Это вернуть значение с помощью специального кода удалены

При этом, если ваша таблица базы данных UTF-8, вам не нужно это преобразование; вместо этого вы можете посмотреть набор символов соединения (или сеанса) (т. е. SET NAMES utf8;). Настройка этого зависит от того, какую библиотеку вы используете для подключения к базе данных.

Чтобы отладить это значение, вы можете использовать bin2hex(); это обычно помогает при поиске в Интернете.

+0

Я пробовал это, и MySQL ему это не понравилось (Query failed: Неверное строковое значение: '\ xBCqqq (...' для столбца). Это «qqq» принадлежит мне. –

+0

@SimonRoberts Я добавил одну вещь, улучшите свой вопрос с помощью точного содержимого строки в шестнадцатеричной нотации. –

+0

Я думаю, что у меня, возможно, были неправильные значения Hex. Я просто посмотрел на него снова, и текстовая строка (подставляя точки для странных символов) - это «... точно ". Соответствующая шестнадцатеричная строка" 74 68 61 74 EF BE 92 73 20 65 78 61 63 74 6C 79 ". –

1

Другим решением является:

$contents = iconv('UTF-8', 'Windows-1251//IGNORE',$contents); 
$contents = iconv('Windows-1251', 'UTF-8//IGNORE',$contents); 

Где можно заменить Windows-1251 к локальной кодировке.

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