2016-06-22 1 views
0

Я прочитал много статей, но до сих пор я не получаю этоUTF-8 Hebrew кодирования и большой знак вопроса

Im импортировать текст из файла с помощью

$fp = fopen($storagename, 'r'); 
while (!feof($fp)){ 
    $line = fgets($fp, 2048); 
    $delimiter = "\t"; 
    $data = str_getcsv($line, $delimiter); 

    print_r($data); 
} 

Для отображения цифр и английских charachters правильно я пришлось использовать

str_replace("\x00", '', $data[7]) 

Но теперь пытается отобразить Hebrew charachters заканчивает тем, как

Я попытался преобразования с Iconv/mb_convert_encoding/utf8_decode/кодирования Ничто не помогает ..

Любая помощь будет большим

+4

Вы не можете просто удалить случайные байты из текстового файла, чтобы отобразить его, это не значит, что должно работать текстовое кодирование. Вам абсолютно необходимо определить кодировку текстового файла (я думаю, это может быть какая-то вариация UTF-16), знать кодировку вашего приложения и использовать правильные функции преобразования, такие как mb_convert_encoding() или iconv(). –

+0

ну, у меня нет этих данных, как я могу узнать кодировку txt-файла? –

+1

Вам придется угадать. Загрузите его в хороший редактор или в свой браузер и измените кодировку, пока она не будет выглядеть хорошо. –

ответ

2

UCS-2 является более старой версии UTF-16, так что вы, вероятно, следует попробовать оба (автоматическое обнаружение текстового кодирования не является пуленепробиваемым заданием).

У нас есть исходная кодировка. Мы можем предположить, что целевая кодировка - UTF-8 (потому что это разумный выбор в 2016 году, и ваш вопрос фактически помечен как UTF-8). Поэтому у нас есть все, что нам нужно.

Мы должны сначала удалить нестандартные манипуляции с исходным байтом (например, удалить str_replace("\x00", '', $data[7]) и аналогичный код). Затем мы можем сделать правильное преобразование. Если вы используете mb_convert_encoding(), первоначальный подход может быть:

$delimiter = "\t"; 
$fp = fopen($storagename, 'r'); 
while (!feof($fp)){ 
    $line = mb_convert_encoding(fgets($fp, 2048), 'UTF-8', 'UCS-2LE'); 
    $data = str_getcsv($line, $delimiter); 
    print_r($data); 
} 

Вы можете проверить список supported encodings.

Но у нас есть потенциальная проблема: нет способа сообщить str_getcsv() о кодировке файла, поэтому маловероятно, что он узнает ваши окончания строк UCS-2.

Вы можете попробовать различные решения в зависимости от размера файла CSV. Если он мал, я просто его сразу преобразую. В противном случае, я буду смотреть на stream_get_line():

Эта функция почти идентична fgets() за исключением того, что она позволяет конец строки разделителей кроме стандартного \ п, \ г и \ г \ п , и не возвращает сам разделитель.

Было бы что-то вроде этого:

$ending = mb_convert_encoding("\n", 'UCS-2LE', 'UTF-8'); 
$line = mb_convert_encoding(stream_get_line($fp, 2048, $ending), 'UTF-8', 'UCS-2LE'); 

Это должно работать с обоими окончаниями Unix строки (\n) и Windows, из них (\r\n).

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