Чтение символов ěščřž из файла документа Word с помощью функции php возвращает вопросительный знак в ромбе

я нашел функцию в PHP, которая неплохо читает файлы MS Word .doc, но когда файл содержит какой-либо из символов "ěščř...", он возвращает вопросительный знак в виде ромба (нераспознанный символ?)

функция выглядит так

if ( file_exists($filename) ) {

        if ( ($fh = fopen($filename, 'r')) !== false ) {

            $headers = fread($fh, 0xA00);

            # 1 = (ord(n)*1) ; Document has from 0 to 255 characters
            $n1 = ( ord($headers[0x21C]) - 1 );

            # 1 = ((ord(n)-8)*256) ; Document has from 256 to 63743 characters
            $n2 = ( ( ord($headers[0x21D]) - 8 ) * 256 );

            # 1 = ((ord(n)*256)*256) ; Document has from 63744 to 16775423 characters
            $n3 = ( ( ord($headers[0x21E]) * 256 ) * 256 );

            # (((ord(n)*256)*256)*256) ; Document has from 16775424 to 4294965504 characters
            $n4 = ( ( ( ord($headers[0x21F]) * 256 ) * 256 ) * 256 );

            # Total length of text in the document
            $textLength = ($n1 + $n2 + $n3 + $n4);

            $extracted_plaintext = fread($fh, $textLength);

            # if you want the plain text with no formatting, do this
            //echo $extracted_plaintext;
            echo mb_detect_encoding($extracted_plaintext);

            # if you want to see your paragraphs in a web page, do this
            echo nl2br($extracted_plaintext);

        }

    }

Также я пытаюсь изменить кодировку символов на UTF-8, в которой у меня есть весь веб-контент, примерно так

$extracted_plaintext = iconv("UTF-8","UTF-8//IGNORE",$extracted_plaintext);

Но он удаляет только недопустимые символы, поэтому текст также не читается. Так что я не уверен, действительно ли эта проблема связана с кодировкой или чем-то еще? Я думаю, что UTF-8 правильный, потому что если я использую echo mb_detect_encoding($extracted_plaintext);, он возвращает UTF-8

редактировать: здесь прикреплен пример файла


person Luboš Suk    schedule 28.04.2016    source источник
comment
Да, это проблема с кодировкой символов UTF-8.   -  person Manoj S Kadlag    schedule 28.04.2016
comment
@manoj.kadlag, а ты знаешь, как это решить? или хотя бы где вопрос может быть? Файл сохраняется как UTF-8, я преобразовываю все в UTF-8, и даже скрипт возвращает информацию, эта строка в UTF-8?   -  person Luboš Suk    schedule 28.04.2016
comment
можешь поделиться ворд файлом?   -  person Manoj S Kadlag    schedule 28.04.2016
comment
@manoj.kadlag извините за задержку, файл .doc доступен здесь dl.dropboxusercontent.com/ u/18032222/myDoc.doc   -  person Luboš Suk    schedule 03.05.2016
comment
На самом деле, mb_detect_encoding() на самом деле не делает того, что все предполагают под его именем. В любом случае, устаревший формат Microsoft Word довольно старый и пришел из мира Windows. Вы уверены, что он использует UTF-8, а не UTF-16 или какую-то кодировку ANSI?   -  person Álvaro González    schedule 03.05.2016
comment
@ ÁlvaroGonzález, могу я как-нибудь выяснить, какую кодировку он использует? я пробовал несколько заголовков html, но безуспешно   -  person Luboš Suk    schedule 03.05.2016
comment
Вы можете догадаться по шестнадцатеричному представлению или найти документацию о формате.   -  person Álvaro González    schedule 03.05.2016


Ответы (2)


Вы пробовали другую кодовую страницу?

По моему опыту, документ Microsoft Office всегда использует локализованную кодировку, скажем, Big5, если регион Тайвань.

Знак вопроса в ромбовидном символе всегда означает неправильную кодировку, но пытается прочитать UTF8. Попробуйте просмотреть мой форум BIG5 в UTF8 http://www.gundamhk.com/

редактировать: я понял, что это не UTF-8 вашего документа, но ближайшие кодировки:

  • Windows-1250,
  • Windows-1252
  • ИСО-8859-1
  • ИСО-8859-2

(И другое похожее имя) Чтобы просмотреть ближайший результат, используйте это:

header('Content-Type: text/html; charset=Windows-1250');

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

person Shintiger    schedule 03.05.2016
comment
Не уверен, что хорошо вас понял, но я попробовал несколько документов, и этот создан вручную для тестирования в той же среде, что и скрипт. - person Luboš Suk; 03.05.2016
comment
да еще и этот файл. Это просто минимизированный пример того, что у меня есть в других файлах. - person Luboš Suk; 03.05.2016
comment
Другой вопрос, вы установили кодировку заголовка http как UTF8? - person Shintiger; 03.05.2016
comment
Да, я думаю, что этого echo "<meta charset='UTF-8'>"; достаточно. - person Luboš Suk; 03.05.2016
comment
Я имею в виду следующее: header('Content-Type: text/html; charset=utf-8'); - person Shintiger; 03.05.2016
comment
Попробуйте Windows-1250, результат аналогичен. - person Shintiger; 04.05.2016
comment
Я пытался, и до сих пор нет результата, поэтому я думаю прекратить попытки и подумать о другом решении. Например, экспортировать ppt в pdf, а затем читать pdf, что не так проблематично. Но спасибо за ваши усилия - person Luboš Suk; 09.05.2016

Чтение файла doc / ppt довольно проблематично (и даже не говоря о специальном символе). Поэтому я нашел более удобным конвертировать документ в pdf, а затем читать pdf, что намного проще. Может быть, это поможет кому-то в будущем не тратить столько времени, сколько я, на попытки прочитать .doc или .ppt.

person Luboš Suk    schedule 09.05.2016