Акценты в загружаемом файле заменяются на '?' - PullRequest
1 голос
/ 23 июня 2011

Я создаю инструмент импорта данных для административной части сайта, над которым я работаю. Данные представлены на французском и английском языках и содержат много акцентированных символов. Всякий раз, когда я пытаюсь загрузить файл, проанализировать данные и сохранить их в моей базе данных MySQL, акценты заменяются на «?».

У меня есть текстовые файлы, содержащие данные (кодировка iso-8859-1), которые я загружаю на свой сервер с помощью библиотеки загрузки файлов CodeIgniter. Затем я читаю файл на PHP.

Мой код похож на это:

$this->upload->do_upload()
$data = array('upload_data' => $this->upload->data());

$fileHandle = fopen($data['upload_data']['full_path'], "r");

while (($line = fgets($fileHandle)) !== false) {
    echo $line;
}

Это создает строки с акцентами, замененными на '?'. Все остальное правильно.

Если я загружаю свой загруженный файл со своего сервера по FTP, кодировка все еще iso-8850-1, но разница показывает, что файл изменился. Однако, если я открою файл в TextEdit, он будет отображаться правильно.

Я пытался использовать метод PHP stream_encoding, чтобы явно установить поток файлов в iso-8859-1, но моя сборка PHP не имеет метода.

После исчерпания идей я попытался обернуть мои строки как в utf8_encode, так и utf8_decode. Ни один из них не работал.

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

Ответы [ 3 ]

4 голосов
/ 23 июня 2011

Важно видеть, происходит ли повреждение до или после того, как запрос был отправлен на MySQL.Здесь слишком много возможных вещей, чтобы быть в состоянии определить это.Можете ли вы вывести свой MySql, чтобы проверить это?

При условии, что ваш запрос сформирован правильно (нет повреждения на этапе вывода запроса), есть пара вещей, которые вы должны проверить.

  1. Какова кодировка символов самой базы данных?(сопоставление)

  2. Что такое Charset соединения - это может быть неправильно установлено в вашей конфигурации mysql и может быть установлено вручную с помощью команды «SET NAMES»

В моем собственном приложении я задаю «SET NAMES utf8» в качестве первого запроса после установления соединения, поскольку я не могу изменить конфигурацию MySQL.

Смотрите это.http://dev.mysql.com/doc/refman/5.0/en/charset-connection.html

Редактировать: Если проблема не связана с mysql, я бы проверил следующее

  1. Вы говорите кодировку файлатакое 'charset iso-8859-1' - могу я спросить, как вы в этом уверены?

  2. Что произойдет, если вы сохраните сам файл как utf8 (без спецификации) и попытаетесь обработать его?

  3. Какова кодировка php файл, который выполняет преобразование?(Что вы используете, чтобы написать свой php - это может быть «управление» для вас нежелательным образом)

  4. (в сторону) Подходят ли файлы, которые вы обрабатываете, для обработки с использованиемвместо fgetcsv?http://php.net/manual/en/function.fgetcsv.php

1 голос
/ 23 июня 2011

Файлы, загруженные на ваш сервер, должны быть возвращены при загрузке. Это означает, что кодировка файла (который представляет собой просто набор двоичных данных) не должна изменяться. Вместо этого вам следует позаботиться о том, чтобы вы могли хранить двоичную информацию этого файла без изменений.

Чтобы добиться этого с вашей базой данных, создайте поле BLOB. Это правильный тип столбца для него. Это просто двоичные данные.

Предполагается, что вы используете MySQL, вот ссылка: Типы BLOB и TEXT , обратите внимание на BLOB.

0 голосов
/ 23 июня 2011

Проблема в том, что вы используете iso-8859-1 вместо utf-8. Для того, чтобы закодировать его в правильной кодировке, вы должны использовать функцию iconv, например, так:

$output_string = iconv('utf-8", "utf-8//TRANSLIT", $input_string);

iso-8859-1 не имеет кодировки для каких-либо акцентов.

Было бы намного лучше, если бы все было utf-8, так как он обрабатывает практически каждый персонаж, известный человеку.

...