чтение файла с правильной кодировкой - PullRequest
6 голосов
/ 27 апреля 2011

У меня есть текстовый файл, где, если я открываю с помощью стандартного текстового редактора в виде блокнота или scite, я могу читать строки, подобные этим:

Artist1 – Title 1
Artist2 – Title 2

Чем я открываю его с помощью моего PHP-скрипта и читаюстроки:

$tracklistFile_name=time().rand(1, 1000).".".pathinfo($_FILES['tracklistFile']['name'], PATHINFO_EXTENSION);
if(((pathinfo($tracklistFile_name, PATHINFO_EXTENSION)=='txt')) && (move_uploaded_file($_FILES['tracklistFile']['tmp_name'], 'import/'.$tracklistFile_name))) {
    $fileArray=file('import/'.$tracklistFile_name, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
    $fileArray=array_values(array_filter($fileArray, "trim"));

    for($i=0; $i<sizeof($fileArray); $i++) {
        echo $fileArray[$i]."<br />";
    }
}

и ... ВАУ ... я получаю этот результат:

Artist1 � Title1 
Artist2 � Title2 

???Что это за символ?Я думаю, что кодировка не удалась.Символы настолько неверны, что я не могу вставить их в базу данных, ни с mysql_real_escape_string().На самом деле я получаю эту ошибку при попытке вставить их:

Incorrect string value: '\x96 Titl...' for column 'atl' at row 1

Как я могу решить эту проблему?Предложения?

РЕДАКТИРОВАТЬ

Попытка добавить utf8_encode () перед вставкой / добавлением этих строк: теперь вставка не завершается ошибкой, но результат:

Artist1  Title1 
Artist2  Title2

Так что я потерял информацию.Почему?

Ответы [ 2 ]

9 голосов
/ 27 апреля 2011

Вам следует прочитать статью Джоэла Спольски о UTF-8 и кодировке .

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

1) ваш phpкод может считывать ввод с использованием неверной кодировки (если вы пытаетесь прочитать в iso-8859, но исходный файл кодируется как-то иначе)

2) ваш php-код может записывать вывод с использованием неправильной кодировки

3) все, что вы используете для чтения вывода (ваш браузер), может быть настроено на кодировку, отличную от байтов, которые вы пишете.

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

РЕДАКТИРОВАТЬ: плохо зная php, похоже, вы могли бы использовать mb_detect_encoding и, возможно, также mb-convert-кодирование .

0 голосов
/ 27 апреля 2011

Попробуйте это: $str = str_replace('\\x', '&#', $str);

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