Имеется: - IIS на W2K (тссс... не надо ругаться. так нельзя, но так надо) - PHP 5.2.1 - файл htm в кодировке UTF(вариант кодировки не пишу - далее объясню), - прикрученная mbstring.dll (phpinfo) mbstring Multibyte Support enabled Multibyte string engine libmbfl Multibyte (japanese) regex support enabled Multibyte regex (oniguruma) version 4.4.4 Multibyte regex (oniguruma) backtrack check On - mbstring.language RU RU строка из кода: - $linenew = mb_convert_encoding($lineold, "CP1251", "UTF-16"); Требуется: перевести данные из файла в кодировке в UTF в кодировку CP1251 Интересности: - я так толком и не смог определить кодировку исходного файла: Опера открывает его корректно только при UTF-16, Notepad++ при UTF-2LE, FAR тупо говорит - Unicode. echo mb_detect_encoding($lineold); выводит что исходная кодировка - UTF-8, но после перекодировки с $linenew = mb_convert_encoding($lineold, "CP1251", "UTF-8"); появляются опять же кракозябры. - Ранее видел в тырнете что в phpinfo порой светится вот такая строчка среди прочих Russian support enabled. У меня такой нет. под виндой новый файлик не скомпилить с данным флагом. Состояние клиента(т.е. меня) Предпсихозное Предупреждения - RTFM не предлагать. Вопрос-Просьба - В какую сторону "копать"? - Имеет ли значение версия dllки? - Если у кого в phpinfo выдает Russian support enabled, прошу сообщить "как они дошли до такой жизни" - Прямые линки на ПРИМЕРЫ очень даже приветствуются. Всем отвечающим по делу - заранее благодарен.
PHP: $fp = fopen ("defindex.htm", "r"); while (!feof($fp)){ $lineget = fgets($fp); // echo mb_detect_encoding($line); проверяю кодировку открытого файла $line = mb_convert_encoding($lineget, "CP1251", "UTF-16"); // собсно конвертирую... и т.д. Как файлик прикрутить сюда htmный не знаю, но текст там такой (думаю в данном контексте он мало что даст) HTML: <HTML> <LINK REL="StyleSheet" Type="text/css" HREF="defindex.css"> <HEAD> <meta http-equiv="Content-Type" content="text/html; charset=UTF-16" /> <TITLE> Объекты </TITLE> </HEAD> <BODY bgcolor=FFFFD6> <A NAME="index"> <H2>ИС</H2> <H3></H3> <A HREF="defs2E4E.htm#d3072" target="SADETAILTARGET"><B>.Net (Технология)</A></B><BR> </BODY> </HTML> кусок php.ini ... extension=php_mbstring.dll ... [mbstring] mbstring.language = RU (остальные строки по mbstring за;млены) как говорил выше, php v5.2.1 php_mbstring.dll v.5.2.1.1 Multibyte String Functions региональные настройки IIS выставлены. Выручайте, дрУги!
ejnadall 1. Файл надо читать как бинарный. Т.е. fopen(..., "rb") 2. fgets() вряд ли будет правильно работать с кодировкой UTF-16. Почему бы не прочитать файл целиком (обычный вызов file_get_contents) и целиком же его не откорвертировать? Также попробуй mb_convert_encoding вместо "UTF-16" скормить "UTF-16BE" и "UTF-16LE".
Попробывал оба способа. Не канает. Еще один нюанс определился (при прежних условиях): не распознаются первые буквы слов и спец символы, в т.ч. пробелы. Получается вот такое чудо http://www.e1.ru/fun/photo/view_pic.php ... a/view.pic Если дословно, то первое слово - АРМ, ниже - Аппаратное обеспечение и т.д.
Правильно ли я понял, что:... PHP: $file = file_get_contents("defindex.htm"); $filec = mb_convert_encoding($file, "CP1251", "UTF-16"); ... print_r($filec); \\увидим что все замечательно...? Если так то не канает.
ejnadall Мдя... что-то странное... Выложи куда-нибудь (желательно в архиве) образец исходного файла (тот, что в непонятной кодировке). Надо смотреть, файл ли виноват или это у тебя mbstring так "ведет себя".
ejnadall Это UTF-16-LE с BOM-ом. Вот работающий код для конвертирования в 1251: PHP: <?php $text=file_get_contents("defindex.htm"); $text=substr($text,2); $text=mb_convert_encoding($text,"CP1251","UTF-16LE");
Dagdamor попробывал. к сожалению, не канает. Если дословно, то: PHP: <?php $text=file_get_contents("defindex.htm"); $text=substr($text,2); $text=mb_convert_encoding($text,"CP1251","UTF-16LE"); echo $text; ?> Не канает с уклоном "в Японский" ... выходит вот такая гадость http://www.e1.ru/fun/photo/view_pic.php ... 1/view.pic можно ли получить Ваш вариант dll'ки и если можно "вырезку" из php.ini по mbstring'у. Если и так не проканает, буду тщательно смотреть в сторону IISа.
эээ... Dagdamor... На Апаче и у меня работает. Более того, все отображается корректно даже без перекодировки mbstring'ом. О как! В том-то и заковыка. Нужно на IIS. Понимаю, что "На кой он тебе сдался", но вот надо. ЗЫ: спасибо за файлики, но к сожалению по прежнему не канает. Взгляни на это http://www.e1.ru/fun/photo/view_pic.php ... 6/view.pic Ранее на форумах я встречал, что в phpinfo отображается Russian - enabled для mbstring'а Имеет ли это значение для wind'ы? В случае с линуховым php рекомендуется перекомпилировать файлик. С виндой такое не проканает. Вероятно буду глядеть в сторону IIS'а может что-то не то с ним.
ejnadall Да я ничего и не говорил. Это я просто свою конфигурацию привел. Насчет "Russian" ничего не могу сказать. Mbstring должен нормально работать с настройками по умолчанию. Давай-ка раз навсегда выясним, правильно ли работает у тебя mb_convert_encoding. Выполни такое: PHP: <?php $text=file_get_contents("defindex.htm"); $text=substr($text,2); $text=mb_convert_encoding($text,"CP1251","UTF-16LE"); echo md5($text); Причем именно для того файла, который ты выложил на Народ. Должно быть 29e8a466002a50f7a91d6a917659cb7d.
Сошлось полностью. Кроме ".", естественно Вы вселяете в меня надежду, коллега, продолжайте, я весь внимание.
ejnadall Вывод: текст бьется не при конвертировании, а при отдаче клиенту. Может, имеет место быть некое автоматическое перекодирование текста, типа как в русском Апаче? В IIS я практически ноль UPD: Скорее всего, где-то передается лишний заголовок Content-Type со значением "text/html; charset=utf-8". Эти иероглифы выглядят так, словно текст в Win1251 вытаются выдать за UTF-8.
Ради интереса поднял на новой машине новый IIS, приаттачил к нему PHP 5.0.4, попробывал перекодировать. Снова то же самое. Не хочет перекодировать. Все те же кракозябы. Вот данные по dll'ке из phpinfo Языковые параметры все выставлены (стандартные виндовые) bstring Multibyte Support enabled Multibyte string engine libmbfl Multibyte (japanese) regex support enabled Multibyte regex (oniguruma) version 3.7.0 mbstring extension makes use of "streamable kanji code filter and converter", which is distributed under the GNU Lesser General Public License version 2.1. Directive Local Value Master Value mbstring.detect_order no value no value mbstring.encoding_translation Off Off mbstring.func_overload 0 0 mbstring.http_input pass pass mbstring.http_output pass pass mbstring.internal_encoding ISO-8859-1 no value mbstring.language neutral neutral mbstring.substitute_character no value no value
Можно выложить живую страничку в архиве сохраненную после конвертирования как там - http://www.e1.ru/fun/photo/view_pic.php ... 1/view.pic ?
Подвожу итоги. Заморочка была в fget'е. Если тащить всем файлом а потом парсить - все оки. Если через fget - получается не корректно (но повторюсь, это было замечено под IIS'ом. Под Апачем все работало нормально и через fget). За сим вопрос считаю закрытым. Спасибо всем участвовавшим в обсуждении.