За последние 24 часа нас посетили 17265 программистов и 1233 робота. Сейчас ищут 1313 программистов ...

Все таже mbstring

Тема в разделе "Регулярные выражения", создана пользователем ejnadall, 18 дек 2007.

  1. ejnadall

    ejnadall Активный пользователь

    С нами с:
    18 дек 2007
    Сообщения:
    12
    Симпатии:
    0
    Имеется:
    - 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, прошу сообщить "как они дошли до такой жизни"
    - Прямые линки на ПРИМЕРЫ очень даже приветствуются.

    Всем отвечающим по делу - заранее благодарен.
     
  2. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    А если попробовать указать UTF-16?
     
  3. ejnadall

    ejnadall Активный пользователь

    С нами с:
    18 дек 2007
    Сообщения:
    12
    Симпатии:
    0
    >>> А если попробовать указать UTF-16?

    Поперепробывал все кодировки. Не канает.
     
  4. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    ejnadall
    Выложи файл (или его кусок) здесь.
     
  5. ejnadall

    ejnadall Активный пользователь

    С нами с:
    18 дек 2007
    Сообщения:
    12
    Симпатии:
    0
    PHP:
    1. $fp = fopen ("defindex.htm", "r");
    2. while (!feof($fp)){
    3. $lineget = fgets($fp);
    4. // echo mb_detect_encoding($line); проверяю кодировку открытого файла
    5. $line = mb_convert_encoding($lineget, "CP1251", "UTF-16"); // собсно конвертирую... и т.д.
    Как файлик прикрутить сюда htmный не знаю, но текст там такой (думаю в данном контексте он мало что даст)
    HTML:
    1. <LINK REL="StyleSheet" Type="text/css" HREF="defindex.css">
    2. <meta http-equiv="Content-Type" content="text/html; charset=UTF-16" />
    3. Объекты
    4. </HEAD>
    5. <BODY bgcolor=FFFFD6>
    6. <A NAME="index">
    7. <H2>ИС</H2>
    8. <H3></H3>
    9. <A HREF="defs2E4E.htm#d3072" target="SADETAILTARGET"><B>.Net (Технология)</A></B><BR>
    10. </BODY>
    11. </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 выставлены.

    Выручайте, дрУги!
     
  6. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    ejnadall
    1. Файл надо читать как бинарный. Т.е. fopen(..., "rb")
    2. fgets() вряд ли будет правильно работать с кодировкой UTF-16.
    Почему бы не прочитать файл целиком (обычный вызов file_get_contents) и целиком же его не откорвертировать?
    Также попробуй mb_convert_encoding вместо "UTF-16" скормить "UTF-16BE" и "UTF-16LE".
     
  7. ejnadall

    ejnadall Активный пользователь

    С нами с:
    18 дек 2007
    Сообщения:
    12
    Симпатии:
    0
    Попробывал оба способа. Не канает.
    Еще один нюанс определился (при прежних условиях): не распознаются первые буквы слов и спец символы, в т.ч. пробелы.
    Получается вот такое чудо
    http://www.e1.ru/fun/photo/view_pic.php ... a/view.pic

    Если дословно, то первое слово - АРМ, ниже - Аппаратное обеспечение и т.д.
     
  8. ejnadall

    ejnadall Активный пользователь

    С нами с:
    18 дек 2007
    Сообщения:
    12
    Симпатии:
    0
    Правильно ли я понял, что:...

    PHP:
    1. $file = file_get_contents("defindex.htm");
    2. $filec = mb_convert_encoding($file, "CP1251", "UTF-16");
    3. ...
    4. print_r($filec); \\увидим что все замечательно...?
    Если так то не канает.
     
  9. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    ejnadall
    Мдя... что-то странное...
    Выложи куда-нибудь (желательно в архиве) образец исходного файла (тот, что в непонятной кодировке). Надо смотреть, файл ли виноват или это у тебя mbstring так "ведет себя".
     
  10. ejnadall

    ejnadall Активный пользователь

    С нами с:
    18 дек 2007
    Сообщения:
    12
    Симпатии:
    0
  11. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    ejnadall
    Это UTF-16-LE с BOM-ом. Вот работающий код для конвертирования в 1251:

    PHP:
    1. <?php
    2.  
    3. $text=file_get_contents("defindex.htm");
    4. $text=substr($text,2);
    5. $text=mb_convert_encoding($text,"CP1251","UTF-16LE");
     
  12. ejnadall

    ejnadall Активный пользователь

    С нами с:
    18 дек 2007
    Сообщения:
    12
    Симпатии:
    0
    Dagdamor
    попробывал. к сожалению, не канает.

    Если дословно, то:
    PHP:
    1. <?php
    2. $text=file_get_contents("defindex.htm");
    3. $text=substr($text,2);
    4. $text=mb_convert_encoding($text,"CP1251","UTF-16LE");
    5. echo $text;
    6. ?>
    7.  
    Не канает с уклоном "в Японский" :) ... выходит вот такая гадость

    http://www.e1.ru/fun/photo/view_pic.php ... 1/view.pic

    можно ли получить Ваш вариант dll'ки и если можно "вырезку" из php.ini по mbstring'у.
    Если и так не проканает, буду тщательно смотреть в сторону IISа.
     
  13. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
  14. ejnadall

    ejnadall Активный пользователь

    С нами с:
    18 дек 2007
    Сообщения:
    12
    Симпатии:
    0
    эээ... :)
    Dagdamor...
    На Апаче и у меня работает. Более того, все отображается корректно даже без перекодировки mbstring'ом. О как!
    В том-то и заковыка. Нужно на IIS. Понимаю, что "На кой он тебе сдался", но вот надо.

    ЗЫ: спасибо за файлики, но к сожалению по прежнему не канает.

    Взгляни на это
    http://www.e1.ru/fun/photo/view_pic.php ... 6/view.pic

    Ранее на форумах я встречал, что в phpinfo отображается Russian - enabled для mbstring'а
    Имеет ли это значение для wind'ы? В случае с линуховым php рекомендуется перекомпилировать файлик. С виндой такое не проканает.
    Вероятно буду глядеть в сторону IIS'а может что-то не то с ним.
     
  15. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    ejnadall
    Да я ничего и не говорил. :) Это я просто свою конфигурацию привел.
    Насчет "Russian" ничего не могу сказать. Mbstring должен нормально работать с настройками по умолчанию.
    Давай-ка раз навсегда выясним, правильно ли работает у тебя mb_convert_encoding. Выполни такое:

    PHP:
    1. <?php
    2.  
    3. $text=file_get_contents("defindex.htm");
    4. $text=substr($text,2);
    5. $text=mb_convert_encoding($text,"CP1251","UTF-16LE");
    6. echo md5($text);
    Причем именно для того файла, который ты выложил на Народ.
    Должно быть 29e8a466002a50f7a91d6a917659cb7d.
     
  16. ejnadall

    ejnadall Активный пользователь

    С нами с:
    18 дек 2007
    Сообщения:
    12
    Симпатии:
    0
    Сошлось полностью. Кроме ".", естественно :)

    Вы вселяете в меня надежду, коллега, продолжайте, я весь внимание.
     
  17. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    ejnadall
    Вывод: текст бьется не при конвертировании, а при отдаче клиенту.
    Может, имеет место быть некое автоматическое перекодирование текста, типа как в русском Апаче? В IIS я практически ноль :(

    UPD: Скорее всего, где-то передается лишний заголовок Content-Type со значением "text/html; charset=utf-8". Эти иероглифы выглядят так, словно текст в Win1251 вытаются выдать за UTF-8.
     
  18. ejnadall

    ejnadall Активный пользователь

    С нами с:
    18 дек 2007
    Сообщения:
    12
    Симпатии:
    0
    Соглашусь. Буду смотреть в IIS. (прищурившись) Очень пристально...
     
  19. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
  20. ejnadall

    ejnadall Активный пользователь

    С нами с:
    18 дек 2007
    Сообщения:
    12
    Симпатии:
    0
    Ради интереса поднял на новой машине новый 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
     
  21. Anonymous

    Anonymous Guest

    Можно выложить живую страничку в архиве сохраненную после конвертирования как там - http://www.e1.ru/fun/photo/view_pic.php ... 1/view.pic ?
     
  22. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    mbstring.internal_encoding убери оттуда ISO-8859-1. Попробуй пустым сделать короче.
     
  23. ejnadall

    ejnadall Активный пользователь

    С нами с:
    18 дек 2007
    Сообщения:
    12
    Симпатии:
    0
    Подвожу итоги.
    Заморочка была в fget'е. Если тащить всем файлом а потом парсить - все оки.
    Если через fget - получается не корректно (но повторюсь, это было замечено под IIS'ом. Под Апачем все работало нормально и через fget).
    За сим вопрос считаю закрытым.
    Спасибо всем участвовавшим в обсуждении.