Russian Qt Forum
Ноябрь 22, 2024, 21:34 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Кодировка в мыле [QT4]  (Прочитано 7381 раз)
Zmey
Гость
« : Июнь 14, 2006, 20:48 »

Получил письмо. "Тема" написана с использованием русских символов. Поэтому в RFC-822 заголовке письма строка:
Subject: =?koi8-r?B?6drNxc7FzsnRINcgU1NO?=
Как мне теперь раскодировать эту строку?
Пример из Assistant:
    QByteArray encodedString = "6drNxc7FzsnRINcgU1NO";
    QTextCodec *codec = QTextCodec::codecForName("KOI8-R");
    QString string = codec->toUnicode(encodedString);

В string содержится "6drNxc7FzsnRINcgU1NO", то есть никаких преобразований.
Или еще вот такая тема:
Subject: =?windows-1251?Q?=CA=E0=F7=E0=EB=EA=E8?=
Записан
Steven_Orko
Гость
« Ответ #1 : Июнь 14, 2006, 21:01 »

Последняя тема записана в UNICODE, сюда по коду. А ты не думал про спам? Там заголовки могут генериться какие угодно )))
Записан
Zmey
Гость
« Ответ #2 : Июнь 14, 2006, 21:11 »

Письма нормальные, например, первая тема это "Изменения в SSN", а вторая это "Качалки". Клиент The Bat! это понимает и выводит нормально. Мне тоже такое надо.
Записан
Sergeich
Гость
« Ответ #3 : Июнь 14, 2006, 21:31 »

Скорей всего сабж записан в base64. Насколько я помню в 4-ой кутехе есть методы для кодирования/декодирования в base64
Записан
Deiv
Гость
« Ответ #4 : Июнь 15, 2006, 08:49 »

Кодировка тем указана в первом токене =?koi8-r?
во втором укзан тип кодирования либо "B" base64 либо "Q" quoted print или как то так
Третий токен - сама тема
сначала её декодируешь либо Q, либо B способом
Потом хаваешь результат, учитывая кодировку прочитанную из первого токена

Хотя возможна сложность - в теме может быть несколько таких строк :-)
Subject: =?windows-1251?Q?=CA=E0=F7=E0=EB=EA=E8?=
=?windows-1251?Q?=CA=E0=F7=?=
=?windows-1251?Q?=E0=EB=EA=E8?=

The header file base64.h
Код:

#include <string>

std::string base64_encode(unsigned char const* , unsigned int len);
std::string base64_decode(std::string const& s);


Код:

#include "base64.h"
#include <iostream>

static const std::string base64_chars =
             "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
             "abcdefghijklmnopqrstuvwxyz"
             "0123456789+/";


static inline bool is_base64(unsigned char c) {
  return (isalnum(c) || (c == '+') || (c == '/'));
}

std::string base64_encode(unsigned char const* bytes_to_encode, unsigned int in_len) {
  std::string ret;
  int i = 0;
  int j = 0;
  unsigned char char_array_3[3];
  unsigned char char_array_4[4];

  while (in_len--) {
    char_array_3[i++] = *(bytes_to_encode++);
    if (i == 3) {
      char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
      char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
      char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
      char_array_4[3] = char_array_3[2] & 0x3f;

      for(i = 0; (i <4) ; i++)
        ret += base64_chars[char_array_4[i]];
      i = 0;
    }
  }

  if (i)
  {
    for(j = i; j < 3; j++)
      char_array_3[j] = '\0';

    char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
    char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
    char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
    char_array_4[3] = char_array_3[2] & 0x3f;

    for (j = 0; (j < i + 1); j++)
      ret += base64_chars[char_array_4[j]];

    while((i++ < 3))
      ret += '=';

  }

  return ret;

}

std::string base64_decode(std::string const& encoded_string) {
  int in_len = encoded_string.size();
  int i = 0;
  int j = 0;
  int in_ = 0;
  unsigned char char_array_4[4], char_array_3[3];
  std::string ret;

  while (in_len-- && ( encoded_string[in_] != '=') && is_base64(encoded_string[in_])) {
    char_array_4[i++] = encoded_string[in_]; in_++;
    if (i ==4) {
      for (i = 0; i <4; i++)
        char_array_4[i] = base64_chars.find(char_array_4[i]);

      char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
      char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
      char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];

      for (i = 0; (i < 3); i++)
        ret += char_array_3[i];
      i = 0;
    }
  }

  if (i) {
    for (j = i; j <4; j++)
      char_array_4[j] = 0;

    for (j = 0; j <4; j++)
      char_array_4[j] = base64_chars.find(char_array_4[j]);

    char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
    char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
    char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];

    for (j = 0; (j < i - 1); j++) ret += char_array_3[j];
  }

  return ret;
}
Записан
Zmey
Гость
« Ответ #5 : Июнь 15, 2006, 18:51 »

Спасибо мэны!
base64 реализован в QByteArray QByteArray::fromBase64 ( const QByteArray & base64 )  [static]
Насчет Quoted-Printable пришлось искать предложения сторонних производителей. Нашлось тут: http://www.codeproject.com/string/ammimeutils.asp
Записан
max1983
Гость
« Ответ #6 : Август 03, 2009, 21:01 »

Насчет Quoted-Printable пришлось искать предложения сторонних производителей. Нашлось тут: http://www.codeproject.com/string/ammimeutils.asp
Тема старовата.
Но у меня задача аналогичная c Quoted-Printable
Кто знает как с помощью http://www.codeproject.com/string/ammimeutils.asp
Закодировать - раскодировать русский текст.
Если делаю в Code::Blocke то полные "каракули" а в QDevelop прога просто падает при попытке с русским текстом.
Больше в интернете аналогичных "утилит" под С++ не нашел.
Встроеных средств QT вроде как нет.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.186 секунд. Запросов: 21.