2013-09-11 5 views
1

Я читаю CSV-файл в php, и насколько я понял - такие файлы могут иметь любую кодировку, которая когда-либо была изобретена hoomans omg и так далее ... я думаю, у меня есть кодировка MacRoman ANSI CSV, я работаю на Mac.Как исправить кодировку при чтении CSV-файла?

До сих пор, так хорошо (совсем не хорошо, но тот уже другая тема) .. Теперь, в то время как переборе строк, у меня есть значение как:

Z�rich 

Очевидно, что это должно быть «Цюрих» - «у» отсутствует ..

Теперь, я попробовал почти все .. mb_detect_encoding говорит «ложь» так, что он не понимает, что это такое ...

Тогда я нашел класс гения Себастьяна Гриньоли здесь ->Detect encoding and make everything UTF-8

Кажется хорошо, но ... все я получил это:

ZŸrich 

на самом деле не «ü» я ожидал: D

Теперь я узнал, что «utf8_encode» будет работать как-то , он генерирует:

Z\u009Frich 

но .. что теперь? если я поместил это непосредственно в базу данных, конечным значением является «Zrich», что означает, что он по-прежнему не является UTF-8, или же db просто борется с экранированным вариантом? Когда я делаю mb_detect_encoding по этому значению, он говорит теперь «UTF-8» .. приятно .. но как я могу идти дальше? Как я могу получить «Zürich» правильный путь в UTF-8?

+0

Какая кодировка в столбце базы данных хранит эти значения? –

+0

изменить набор символов на utf8 при создании таблицы – rams0610

+0

в моем приложении, все это utf-8, из таблицы, в код в браузер - все .. проблема здесь возникает, когда я читаю файл, который загружается пользователем, созданным MS Excel на любом клиентском компьютере, поэтому файл может быть закодирован во всем, и я не могу контролировать это:/ (источник: http://stackoverflow.com/questions/508558/ что-charset-does-microsoft-excel-use-when-save-files) – jebbie

ответ

3

Возможно, вы используете iconv для преобразования. На моей установке, кодирование MacRoman называется просто "MAC":

$city = "Z\x9frich"; 
$city = iconv("MAC", "UTF-8", $city); 
echo $city; // Output: Zürich 
+0

iconv даже может напрямую исправить текст из Z rich в Zürich, но вам нужно знать кодировку, которая довольно сложна, когда mb_detect_encoding всегда возвращающий «false» ->, поэтому я написал свое собственное обнаружение, которое описано здесь: http://php.net/manual/de/function.mb-detect-encoding.php – jebbie

+0

Трудно различать однобайтовые кодировки, потому что каждый байт последовательность действительна, u nlike в кодировании с переменным байтом. Если у вас нет какой-либо информации о происхождении текста, вам придется сделать предположение, основанное, например, на буквенных или n-граммных частотах. – Joni

+0

звучит интересно, в настоящее время я реализовал уже своего рода дикое угадывание, как описано в комментариях к php doc, но мне нужно разобраться с тем, что вы пишете;) – jebbie

1

Попытка преобразовать все файлы с первым Iconv. И импортировать позже. Или итерации каждой строки и конвертировать с iconv.

Вы должны знать исходную кодировку своего файла.

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