Можно ли текстовый файл с неизвестной кодировкой преобразовать в UTF-8 на PHP

Тема в разделе "PHP", создана пользователем jabbaxatt, 22 ноя 2012.

Статус темы:
Закрыта.
Модераторы: latteo
  1. jabbaxatt

    jabbaxatt Добрый модератор

    Moderator
    Регистр.:
    21 янв 2009
    Сообщения:
    890
    Симпатии:
    418
    Есть текстовый файл (или текст в переменной, без разницы) с неизвестной нам кодировкой (windows 1251, ANSI, UTF-8, UCS-2 ещё какая дрянь) Нужно этот текст преобразовать в UTF-8. Т.е. как в Notepad++ есть команда "преобразовать в UTF-8 без бом".

    Можно ли написать такую функцию на PHP?

    Судя по мануалам мы даже имеющуюся кодировку точно определить не можем, но проблема наверняка встречалась многим, должны были уже чего-нить придумать.
     
  2. Inviseble_Demon

    Inviseble_Demon

    Регистр.:
    11 дек 2008
    Сообщения:
    482
    Симпатии:
    351
    нихрена так и не придумали толкового...
    тоже был подобный вопрос но мне было проще я с http работал... Были 90 мы тянули кодировку от куда могли :D

    точно определить ни как.
    1) http header (Content-Type: text/html; charset=utf-8)
    2) meta in html ...

    И то там могут врать че хотят...
     
    jabbaxatt нравится это.
  3. jabbaxatt

    jabbaxatt Добрый модератор

    Moderator
    Регистр.:
    21 янв 2009
    Сообщения:
    890
    Симпатии:
    418
    Подскажите тогда, пожалуйста, как точно определить кодировку при загрузки страницы по Http? Может тоже пригодится.

    Дас. Жопа получается с этим в PHP.

    Учитывая что решения нет - в голову приходить только подбор по словарю (берём длинные но часто встречающиеся слова в кодировке х, ищем их в тексте, повторяем для аналогичного словаря в кодировках Y-Z-M-N...., считаем количество совпадений в тексте, выбираем ту кодировку где совпадений намного больше ).

    Получается дикая ресурсоёмкость и куча кода, хотя по идее точность будет очень высокой при нормальном словаре.

    В моём конкретном случае видимо придётся в ручную писать признаки для случаев отличных от UTF-8, благо ПОКА это возможно.
     
  4. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.517
    Симпатии:
    1.366
    Вот хорошая тема с замечательным решением https://nulled.cc/threads/198585/ - Определение кодировки при загрузке по http
     
    jabbaxatt нравится это.
  5. zaxap83

    zaxap83 Постоялец

    Регистр.:
    6 дек 2010
    Сообщения:
    87
    Симпатии:
    28
    Есть такая штука - Перейти по ссылке, которая умеет определять три типа - koi8, win1251 и utf8. По умолчанию перегоняет текст в win1251, но не составит труда переделать выход под utf8. Не совсем универсальное решение, но его тут быть и не может, хоть что-то.
     
  6. d1mmas

    d1mmas Создатель

    Регистр.:
    22 июн 2012
    Сообщения:
    13
    Симпатии:
    0
    Имеется функция iconv

    Ее синтаксис следующий:
    string iconv ( string in_charset, string out_charset, string str ), где
    string in_charset – это изначальная кодировка,
    string out_charset – кодировка, в которую необходимо преобразовать данные,
    string str – собственно та строка, которую нужно перекодировать.

    Например:
    $message=iconv("cp1251", "utf-8", $_POST['message'])

    Здесь кодировку переменной $message, которая была передана из формы, мы меняем с windows-1251 на utf-8.
     
  7. ShaDeRzz

    ShaDeRzz

    Регистр.:
    16 окт 2007
    Сообщения:
    176
    Симпатии:
    65
    d1mmas, прикол-то в том, что исходная кодировка неизвестна, к тому же от файла к файлу она может меняться ;)

    В С++ для этого есть MultiByteToWideChar
    В PHP есть функция "mb_detect_encoding" для определения кодировки. Правда она не всегда работает корректно
    А вот тут: Перейти по ссылке есть решение с классом Encoding и методом fixUTF8 Encoding::fixUTF8. Я его не юзал, но народ плюсует этот метод, а значит он рабочий...
     
    jabbaxatt нравится это.
  8. trooll

    trooll PHP кодер

    Регистр.:
    22 дек 2008
    Сообщения:
    503
    Симпатии:
    116
    Я даже больше скажу, она вообще никогда коректно не работает, кроме как определять utf8 толком не чего не может.
     
  9. upsarin

    upsarin Создатель

    Регистр.:
    11 дек 2006
    Сообщения:
    23
    Симпатии:
    18
    Не знаю почему - но обычно работает:
     
Статус темы:
Закрыта.