@user0name0

Что делать с кодировкой в боте для Telegram?

Делаю телеграм-бота. Данные принимаются в json, в кодировке cp1251 и конвертируются в utf-8. При отправлении текста "Aukštųjų" превращается в "Auk", а с urlencode в "Aukštųjų". Если просто выводить получаемые данные в браузер, копировать их и отправлять вручную, с локального сервера или через heroku, то все работает. А когда данные берутся извне, то обрезаются при отправке до первого необычного символа. Почему такое происходит и что делать?
$json= iconv('cp1251', 'utf-8', $json);
$json= json_decode($json, 1);
$text = $json[0]['text'];   // $text = Aukštųjų
$result = $url . '&text=Aukštųjų';   // Результат: Aukštųjų
$result = $url . '&text=' . $text;   // Результат: Auk
$result = $url . '&text=' . urlencode($text);   // Результат: Aukštųjų
  • Вопрос задан
  • 5281 просмотр
Пригласить эксперта
Ответы на вопрос 1
Moskus
@Moskus
У вас ошибка на ошибке.
1) JSON должен быть в UTF-8. А вы пишете, что данные принимаются (откуда принимаются?) не в Unicode, а в восьмибитной win 1251. Так быть не должно.
2) Вы верите содержимому заголовка, где написано win 1251, но это ложь, потому что эта кодировка - кириллическая, она не может передавать символы š и ų - убедитесь лично: https://en.wikipedia.org/wiki/Windows-1251
3) Потому что (2), код iconv('cp1251', 'utf-8', $json) не имеет смысла. Если ваш JSON действительно передается в восьмибитной кодировке (что само по себе - ошибка, см. пункт 1), то это либо ISO 8859-10, либо ISO 8859-4.
Я не могу вам сказать, как конкретно исправить ситуацию, потому что в вопросе недостаточно данных - слишком много ошибок наложено друг на друга. Начать решать проблему нужно, очевидно, с начала, то есть с выяснения, в какой действительно кодировке передается JSON (не глядя на HTTP-header, а глядя на сами данные).
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы