codifica oggetto e-mail giapponese
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.
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:
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");