За последние 24 часа нас посетили 20130 программистов и 1077 роботов. Сейчас ищут 718 программистов ...

Проблема с кодировками.

Тема в разделе "Прочие вопросы по PHP", создана пользователем krow7, 3 окт 2012.

  1. krow7

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

    С нами с:
    12 авг 2009
    Сообщения:
    398
    Симпатии:
    0
    Адрес:
    из Азии
    Всем ку.
    написал вот такую строчку и удивился:
    Код (PHP):
    1. <?php
    2. echo mb_convert_encoding(mb_convert_encoding('Мирта', 'UTF-8', 'ASCII'), 'ASCII', 'UTF-8');
    3.  
    Надеялся увидеть мирту, однако увидал одни ????
    У вас так же? Если да, то почему так?
    Если нет, то что у меня такое? :D
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    В аски нету ж русских букв.
     
  3. krow7

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

    С нами с:
    12 авг 2009
    Сообщения:
    398
    Симпатии:
    0
    Адрес:
    из Азии
    Просто у меня такое дело.
    У меня есть асечный бот, и когда запрашиваешь у него контакт-лист, то вместе с уинами приходят и никнеймы.
    Так вот, некоторые русские никнеймы с помощью
    Код (PHP):
    1. <?php
    2. mb_convert_encoding($v, "cp1251", "UTF-8"); 
    отлично становятся русско-читаемыми (Например, Капитан Авокадо => Капитан Авокадо).
    Но есть один, который написан как Ìèðòà (Мирта, как раз-таки), который с помощью вышеупомянутого хинта првращается в вопросики.
    Однако, если написать
    Код (PHP):
    1. <?php
    2. mb_convert_encoding('Мирта', "UTF-8", "cp1251"); 
    получится именно ÌèðòГ, а вот обратно - вопросики.
    Как мне тогда, все-таки, конвертировать?
    Требую разъяснений :)
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    эм...
    Код (Text):
    1.  
    2. echo mb_convert_encoding(mb_convert_encoding('Мирта', 'UTF-8', 'ASCII'), 'ASCII', 'UTF-8');
    3. ??????????
    Код (Text):
    1. echo mb_convert_encoding(mb_convert_encoding('Мирта', "UTF-8", "cp1251"), "cp1251", "UTF-8");
    2. Мирта
     
  5. krow7

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

    С нами с:
    12 авг 2009
    Сообщения:
    398
    Симпатии:
    0
    Адрес:
    из Азии
    igordata, ваши вставочки понятны, просто получается, что слово "Мирта" было закодировано как mb_convert_encoding('Мирта', "UTF-8", "ASCII"), а вот обратно мне его как получить без вопросиков?
    mb_convert_encoding('Мирта', "cp1251", "UTF-8") - не катит
    mb_convert_encoding('Мирта', "ASCII", "UTF-8") - не катит (вопросики)
    как поступить? :)
     
  6. Ke1eth

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

    С нами с:
    16 мар 2012
    Сообщения:
    1.073
    Симпатии:
    11
    Адрес:
    заблудилса
    честно, но помоему это все, пат.
     
  7. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    еще раз
    в ASCII НЕТ русских букв =)
     
  8. krow7

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

    С нами с:
    12 авг 2009
    Сообщения:
    398
    Симпатии:
    0
    Адрес:
    из Азии
    Да я понял уже это, но дело в том, что квип показывает, что у данного уина никнейм Мирта, а класс для работы с ОСКАРом получает никнейм вот так: ÌèðòГ, что получается ТОЛЬКО после mb_convert_encoding('Мирта', "UTF-8", "ASCII"), логично было бы сделать обратную раскодировку, но, как вы уже заметили в третий раз, на выходе одни только вопросики, т.к. в аски нет русских букоф
     
  9. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Попробуй:
    Код (PHP):
    1. $enc = mb_convert_encoding($str, 'Windows-1252', 'utf-8');
    2. header('Content-Type: text/html; charset=Windows-1251');
    3. echo($enc); 
    Добавлено спустя 1 минуту 17 секунд:
    Кстати, ты не полностью скопировал иероглифы походу. Там после "ÌèðòГ" ещё пробельный символ на конце должен быть, вроде.

    Добавлено спустя 18 минут 19 секунд:
    Причём не обычный пробел (код: 0x20), а неразрывный (код: 0xA0). Его скопировать не получается со страницы в браузере (он при копировании превращается в обычный пробел 0x20). Можно скопировать только из исходного кода страницы.
     
  10. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    Чего ты пристал к этому аски?
     
  11. Ke1eth

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

    С нами с:
    16 мар 2012
    Сообщения:
    1.073
    Симпатии:
    11
    Адрес:
    заблудилса
    У меня года примерно с 2006 сложилось ощущение, что квип может показывать, что ему угодно.
    История такова: пользовался я тогда сим пейджером достаточно долго, а потом в связи с миграцией на альтернативные ОС, я пересел на pidgin, причем конкретно, как под альтернативными операционками, так и под дефолтно подразумевающейся. Ну дак вот, в пиджине при получении списка контактов с сервера в русскоязычных никах была удивительная картина, часть ников нормально отображалась, часть собственно так-же криво, а еще у одной части, кракозябнуты были тока отдельные символы в никах. Вопрос тут скорее уже к квиповодам, что там у них в потрохах происходит? :)
    Интересный момент: все 3 части пользователей объединяло примерно одно - они добавлялись из под разных версий (ибо пейджер сей тогда обновлялся со скоростью размножающихся кроликов).
     
  12. krow7

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

    С нами с:
    12 авг 2009
    Сообщения:
    398
    Симпатии:
    0
    Адрес:
    из Азии
    Ну тогда понятно :)
    Что ж, придется мириться с шифрами =\
     
  13. arslaman

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

    С нами с:
    26 мар 2013
    Сообщения:
    1
    Симпатии:
    0
    Здравствуйте.
    Возникла необходимость кодировать текст в CP-1251 перед отправкой, на принимающей стороне текст вновь кодируется из CP-1251 в UTF8.
    Сейчас заметил что с символом "И" возникают проблемы.
    Код (Text):
    1. echo mb_convert_encoding(mb_convert_encoding('АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя', 'UTF-8', 'Cp-1251'), 'Cp-1251', 'UTF-8');
    Данный код выводит:
    Код (Text):
    1. АБВГДЕЖЗ▒?ЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя
    Проблема возникает именно на шаге конвертации из UTF8 в CP-1251.
    Функция iconv:
    Код (Text):
    1.  
    2. echo iconv("utf-8", "windows-1251", iconv("windows-1251", "utf-8//IGNORE", 'АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя'));
    3. АБВГДЕЖЗ▒ЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя
    Если IGNORE не ставить, то запинается на букве "И".
    Никто не сталкивался? Как решить данную проблему?
     
  14. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    именно поэтому и перешли на UTF. символы из верхней части таблицы имеют техническое назначение. как раз там и живут русские буквы. почему оно там запинается - хз. видимо этот символ несет какую-то смысловую нагрузку для парсера.