API Gmail — как правильно анализировать данные тела сообщения?

#ruby-on-rails #encoding #utf-8 #gmail #ascii

#ruby-on-rails #кодирование #utf-8 #gmail #ascii

Вопрос:

Я использую новый API Gmail и абсолютно уверен в том, как правильно обрабатывать кодировку части [body] [data] в Ruby / Rails как для текстового / простого сообщения, так и для текстового / html-сообщения.

Допустим, данные = закодированная часть сообщения.

Вызов Base64.decode64(data).unpack("M") возвращает текстовое тело в кодировке US-ASCII с большим количеством пропущенных символов, отображаемое на веб-странице.

Вызов Base64.decode64(data).encode('UTF-8') выдает ошибку преобразования US-ASCII в UTF-8

Тем не менее, если я это сделаю Base64.decode64(data).encode('UTF-8', {:invalid => :replace, :undef => :replace, :replace => '?'}) , я все еще вижу кучу вопросительных знаков.

Может кто-нибудь указать мне правильное направление в том, как правильно закодировать и отобразить тело сообщения в UTF-8?

Форматирование ответа электронной почты в формате JSON выглядит следующим образом:

 "parts": [
   {
    "partId": "0",
    "mimeType": "text/plain",
    "filename": "",
    "headers": [
     {
      "name": "Content-Type",
      "value": "text/plain; charset=UTF-8"
     },
     {
      "name": "Content-Transfer-Encoding",
      "value": "quoted-printable"
  

Ответ №1:

Используется Base64.urlsafe_decode64 для декодирования тела сообщения.

Ответ №2:

 var base64toUTF8 = function base64toUTF8(str,urlsafe) {
  if(urlsafe) {
    str = str.replace(/_/g,"/");
    str = str.replace(/-/g," ");
  }
  if(typeof window) {
    return decodeURIComponent(escape(window.atob( str )));
  }
  else if(typeof module !== 'undefined' amp;amp; module.exports) {
    return new Buffer("SGVsbG8gV29ybGQ=", 'base64').toString('utf8');
  }
};
  

просто нужно заменить символы в кодировке base64 ‘-‘ на ‘ ‘ и ‘_’ на ‘/’

Комментарии:

1. Это похоже на JavaScript, а не на Ruby.

Ответ №3:

Основываясь на ответе Бхаргава Кришны, вот версия, дружественная к NodeJS:

 var base64toUTF8 = function base64toUTF8(str, urlsafe) {
  if (urlsafe) {
    str = str.replace(/_/g,"/");
    str = str.replace(/-/g," ");
  }
  return new Buffer(str, 'base64').toString('utf8');
};
  

Я удалил ссылки на window vs module, а также сделал так, чтобы фактически использовался NodeJS str , а не просто «Привет, мир!»

Комментарии:

1. Это похоже на JavaScript, а не на Ruby.