Domanda

Allo stesso tempo, codificare le email giapponesi è alquanto impegnativo, che sto lentamente scoprendo. Nel caso in cui ci siano esperti (anche quelli con esperienza limitata lo faranno), posso avere alcune linee guida su come farlo, come testarlo e come verificarlo?

Tieni presente che non ho mai messo piede da nessuna parte vicino al Giappone, è semplicemente che il prodotto che sto sviluppando viene utilizzato lì, tra gli altri luoghi.

Quello che (penso) so finora è il seguente:
- Le email giapponesi devono essere codificate in ISO-2022-JP, la tabella codici JIS giapponese 50220 o eventualmente la tabella codici SHIFT_JIS 932
- La codifica del trasferimento e-mail deve essere impostata su Base64 per testo normale e 7 bit per HTML
- L'oggetto dell'email deve essere codificato separatamente per iniziare con " =? ISO-2022-JP? B? & Quot; (non so cosa dovrebbe significare). Ho provato a codificare l'argomento con

"=?ISO-2022-JP?B?" + Convert.ToBase64String(Encoding.Unicode.GetBytes(subject))

che sostanzialmente fornisce la stringa codificata come previsto ma non viene presentata come nessun testo giapponese in un programma di posta elettronica
- Ho testato in Outlook 2003, Outlook Express e GMail

Qualsiasi aiuto sarebbe molto apprezzato


Ok, quindi per pubblicare un breve aggiornamento, grazie alle due utili risposte, sono riuscito a ottenere il formato e la codifica corretti. Ora Outlook offre qualcosa che assomiglia all'argomento corretto:
=? iso-2022-jp? B? 6 Test giapponese ? ? ? ? ?? ? ? ? ? ? ? ? ?? 6 ?? ? ??? =

Tuttavia, la stessa identica e-mail in Outlook Express fornisce un oggetto come questo:
=? iso-2022-jp? B? 6 Test giapponese ? ? ? · · · ? ? ? ? ? ? ? ? ? ? ? ? i ? ?? ? · 6 ? ? ? ? · ? ? ? ?? =

Inoltre, quando visualizzato nella vista Posta in arrivo in Outlook Express, l'oggetto dell'e-mail è ancora più strano, come questo:
=? iso-2022-jp? B? 6 Test giapponese ???????????????? 6 ??????? =

Gmail sembra funzionare in modo simile a Outlook, che sembra corretto.

Non riesco proprio a capirlo.

È stato utile?

Soluzione

Mi occupo di codifiche giapponesi da quasi 20 anni e quindi posso simpatizzare con le tue difficoltà. I siti Web su cui ho lavorato inviano centinaia di e-mail ogni giorno ai clienti giapponesi in modo da poter condividere con te ciò che ha funzionato per noi.

  • Prima di tutto, non usare Shift-JIS. Personalmente ricevo tonnellate di e-mail giapponesi e quasi mai vengono codificate utilizzando Shift-JIS. Penso che una vecchia versione (circa Win 98?) Di Outlook Express abbia codificato la posta in uscita usando Shift-JIS, ma al giorno d'oggi non la vedi.

  • Come hai capito, devi usare ISO-2022-JP come codifica per almeno tutto ciò che si trova nell'intestazione della posta. Ciò include l'oggetto, la linea A e la linea CC. UTF-8 funzionerà anche nella maggior parte dei casi, ma non funzionerà sulla posta di Yahoo Japan e, come puoi immaginare, molti utenti giapponesi usano la posta di Yahoo Japan.

  • È possibile utilizzare UTF-8 nel corpo dell'e-mail, ma si consiglia di base64 codificare il testo giapponese codificato UTF-8 e inserirlo nel corpo anziché nel testo UTF-8 non elaborato. Tuttavia, in pratica, credo che il testo non elaborato UTF-8 funzioni bene in questi giorni, per il corpo dell'e-mail.

  • Come ho accennato in precedenza, è necessario testare almeno su Outlook (Exchange), Outlook Express (IMAP / POP3) e Yahoo Web mail. Yahoo Japan è il più complicato perché credo che utilizzino EUC per la codifica delle loro pagine Web, quindi è necessario seguire gli standard corretti per le e-mail o non funzioneranno (ISO-2022-JP è lo standard per l'invio di e-mail giapponesi ).

  • Inoltre, la riga dell'oggetto non deve superare 75 caratteri per riga. Cioè, 75 caratteri dopo sono stati codificati in ISO-2022-JP e base64, non 75 caratteri prima della conversione. Se superi 75 caratteri, devi suddividere il soggetto codificato in più righe, iniziando con " =? Iso-2022-jp? B? & Quot; e termina con "? = " su ogni riga. In caso contrario, l'oggetto potrebbe essere troncato (a seconda del lettore e-mail e anche del contenuto del testo dell'oggetto). Secondo RFC 2047:

" Una 'parola codificata' non può contenere più di 75 caratteri, inclusi 'set di caratteri', 'codifica', 'testo codificato' e delimitatori. Se è desiderabile codificare più testo di quello che si adatterà in una "parola codificata" di 75 caratteri, è possibile utilizzare più "parole codificate (separate da CRLF SPACE). & Quot;

  • Ecco un esempio di codice PHP per codificare l'oggetto:

 // Convert Japanese subject to ISO-2022-JP (JIS is essentially ISO-2022-JP)

 $subject = mb_convert_encoding ($subject, "JIS", "SJIS");

 // Now, base64 encode the subject

 $subject = base64_encode ($subject);

 // Add the encoding markers to the subject

 $subject = "=?iso-2022-jp?B?" . $subject . "?=";

 // Now, $subject can be placed as-is into the raw mail header.
  • Vedi RFC 2047 per una descrizione completa di come codificare l'intestazione della tua email.

Altri suggerimenti

Controlla http://en.wikipedia.org/wiki/MIME#Encoded-Word per una descrizione su come codificare i campi di intestazione nei messaggi conformi a MIME. Sembra che manchi un & # 8220;? = & # 8221; alla fine del soggetto.

=? ISO-2022-JP? B? TEXTTEXT ...

ISO_2022-JP significa che la stringa è codificata nella tabella codici ISO-2022-JP (es. non Unicode) B significa che la stringa è codificata bese64

Nel tuo esempio, dovresti solo fornire la tua stringa in ISO-2022-JP invece di Unicode.

Ho esperienza nella composizione e nell'invio di e-mail in giapponese ... Normalmente devi fare attenzione a quale codifica viene utilizzata per il sistema operativo e come memorizzi le tue stringhe giapponesi! Gli oggetti My Mail sono normalmente codificati come segue:

    string s = "V‚µ‚¢ŠwK–@‚Ì‚²’ñˆÄ"; // Our japanese are shift-jis encoded, so it appears like garbled
    MailMessage message = new MailMessage();
    message.BodyEncoding = Encoding.GetEncoding("iso-2022-jp");
    message.SubjectEncoding = Encoding.GetEncoding("iso-2022-jp");
    message.Subject = s.ToEncoding(Encoding.GetEncoding("Shift-Jis")); // Change the encoding to whatever your source is
    message.Body = s.ToEncoding(Encoding.GetEncoding("Shift-Jis")); // Change the encoding to whatever your source is

Quindi ho un metodo di estensione a cui fa la conversione per me:

public static string ToEncoding(this string s, Encoding targetEncoding)
        {   
            return s == null ? null : targetEncoding.GetString(Encoding.GetEncoding(1252).GetBytes(s)); //1252 is the windows OS codepage            
        }

qualcosa del genere dovrebbe portare a termine il lavoro in python:


#!/usr/bin/python                                                                                                            
# -*- mode: python; coding: utf-8 -*-                                                                                        
import smtplib
from email.MIMEText import MIMEText
from email.Header import Header
from email.Utils import formatdate

def send_from_gmail( from_addr, to_addr, subject, body, password, encoding="iso-2022-jp" ):

    msg = MIMEText(body.encode(encoding), 'plain', encoding)
    msg['Subject'] = Header(subject.encode(encoding), encoding)
    msg['From'] = from_addr
    msg['To'] = to_addr
    msg['Date'] = formatdate()

    s = smtplib.SMTP('smtp.gmail.com', 587)
    s.ehlo(); s.starttls(); s.ehlo()

    s.login(from_addr, password)
    s.sendmail(from_addr, to_addr, msg.as_string())
    s.close()
    return "Sent mail to: %s" % to_addr



if __name__ == "__main__":
    import sys
    for n,item in enumerate(sys.argv):
        sys.argv[n] = sys.argv[n].decode("utf8")

    if len(sys.argv)==6:
        print send_from_gmail( sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4], sys.argv[5] )
    elif len(sys.argv)==7:
        print send_from_gmail( sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4], sys.argv[5], encoding=sys.argv[6] )
    else:
        raise "SYNTAX: %s <from_addr> <to_addr> <subject> <body> <password> [encoding]"

** palesemente rubato / adattato da:

http://mtokyo.blog9.fc2.com/blog-entry -127.html

Prima di tutto dovresti usare:

Encoding.GetEncoding (" ISO-2022-JP ")

per convertire la riga dell'oggetto in byte che verranno elaborati da Convert.ToBase64String ().

=? ISO-2022-JP? B? TEXTTEXT ...? = indica al client di posta ricevente quale codifica è stata utilizzata dal lato del mittente per convertire le lettere giapponesi "quot" in un flusso di byte.

Attualmente stai usando UTF-16 per codificare, ma specificando ISO-2022-JP per decodificare. Queste sono ovviamente due diverse codifiche, immagino, proprio come ISO-8859-1 è diverso da Unicode (i caratteri più estesi dell'Europa occidentale sono rappresentati da un byte in ISO-XXX, ma due byte in Unicode).

Non sono sicuro di cosa intendi se UTF-8 è cittadino di seconda classe. Finché il client di posta ricevente capisce UTF-8 ed è in grado di convertirlo nell'attuale locale giapponese, tutto va bene.

<?php

function sendMail($to, $subject, $body, $from_email,$from_name)
 {
$headers  = "MIME-Version: 1.0 \n" ;
$headers .= "From: " .
       "".mb_encode_mimeheader (mb_convert_encoding($from_name,"ISO-2022-JP","AUTO")) ."" .
       "<".$from_email."> \n";
$headers .= "Reply-To: " .
       "".mb_encode_mimeheader (mb_convert_encoding($from_name,"ISO-2022-JP","AUTO")) ."" .
       "<".$from_email."> \n";


$headers .= "Content-Type: text/plain;charset=ISO-2022-JP \n";


/* Convert body to same encoding as stated
in Content-Type header above */

$body = mb_convert_encoding($body, "ISO-2022-JP","AUTO");

/* Mail, optional parameters. */
$sendmail_params  = "-f$from_email";

mb_language("ja");
$subject = mb_convert_encoding($subject, "ISO-2022-JP","AUTO");
$subject = mb_encode_mimeheader($subject);

$result = mail($to, $subject, $body, $headers, $sendmail_params);

return $result;
}

L'introduzione della codifica giapponese all'e-mail è avvenuta a JUNET (rete nazionale UUCP) all'inizio degli anni '90.

A quel tempo, fu definito RFC1468.  Se segui RFC1468 nella posta in chiaro, non ci sarebbero problemi.

Se si desidera gestire la posta html, RFC1468 è inutile ad eccezione delle parti di intestazione.

Ecco cosa uso per inviare e-mail giapponesi. La riga dell'oggetto sembra a posto in Outlook 2010, Gmail e su iPhone.

Encoding encoding = Encoding.GetEncoding("iso-2022-jp");
byte[] bytes  = encoding.GetBytes(subject);
string uuEncoded = Convert.ToBase64String(bytes);
subject = "=?iso-2022-jp?B?" + uuEncoded + "?=";

// not sure this is actually necessary...
mailMessage.SubjectEncoding = Encoding.GetEncoding("iso-2022-jp");
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top