2009-01-07 14 views
13

Aparentualmente, la codificación de correos electrónicos en japonés es algo desafiante, y poco a poco me estoy descubriendo a mí mismo. En caso de que haya expertos (incluso aquellos con experiencia limitada), ¿puedo por favor tener algunas pautas sobre cómo hacerlo, cómo probarlo y cómo verificarlo?correo electrónico japonés codificación del tema

Tenga en cuenta que nunca he puesto un pie en ningún lugar cerca de Japón, es simplemente que el producto que estoy desarrollando se utiliza allí, entre otros lugares.

Lo que (creo) que sé hasta ahora es lo siguiente:
- correos electrónicos japoneses deben ser codificados en ISO-2022-JP, japonesa página de códigos JIS 50220 o posiblemente página de códigos SHIFT_JIS 932
- Email codificación de transferencia deben establecerse en Base64 para texto sin formato y 7 bits para HTML
- El asunto del correo electrónico debe codificarse por separado para comenzar con "=? ISO-2022-JP? B?" (no sé lo que se supone que significa) He intentado que codifica el tema con

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

que básicamente da la cadena codificada como se esperaba, pero que no consigue presentan como cualquier texto japonés en un programa de correo electrónico
- He probado en Outlook 2003, Outlook expresar y GMail

Cualquier ayuda sería muy apreciada


Ok, por lo que a enviar una breve actualización, gracias a las dos respuestas útiles, me las he arreglado para obtener el formato y la codificación correcta. Ahora, Outlook da algo que se parece al sujeto correcto:
=?iso-2022-jp?B?6 Japanese test に各々の視点で語ってもらった。 6相当の防水?=

Sin embargo, la misma exacta de correo electrónico en Outlook Express da tema como éste:
=?iso-2022-jp?B?6 Japanese test 縺ォ蜷・・・隕也せ縺ァ隱槭▲縺ヲ繧ゅi縺」縺溘・ 6逶ク蠖薙・髦イ豌エ?=

Por otra parte, cuando se ve en la vista Bandeja de entrada en Outlook Express , el asunto del correo electrónico es aún más raro, como esto:
=?iso-2022-jp?B?6 Japanese test ??????????????? 6???????=

Gmail parece estar funcionando en el modo similar a Outlook, que se parece correcta.

No puedo entender esto.

+0

sus suposiciones son correctas, pero no estoy seguro de la sintaxis lo siento. –

+1

Me pregunto, ¿por qué no puedes usar UTF-8? –

+0

Usted "podría" usar UTF-8, pero la realidad en Japón es que UTF-8 todavía es un ciudadano de segunda clase con diferencia. La mayoría de las máquinas y documentos japoneses que he encontrado en agencias gubernamentales, empresas y escuelas aquí en Japón todavía son SHIFT_JIS. –

Respuesta

22

que he estado tratando con codificación japonesa durante casi 20 años y entonces puedo simpatizar con tus dificultades. Los sitios web en los que he trabajado envían cientos de correos electrónicos diarios a clientes japoneses para que pueda compartir con ustedes lo que funcionó para nosotros.

  • Antes que nada, no use Shift-JIS. Personalmente recibo toneladas de correos electrónicos japoneses y casi nunca están codificados usando Shift-JIS. Creo que una versión antigua (circa Win 98?) De Outlook Express codificó el correo saliente usando Shift-JIS, pero hoy en día simplemente no lo ves.

  • Como ya sabrá, debe usar ISO-2022-JP como codificación para al menos cualquier cosa que vaya en el encabezado del correo. Esto incluye la línea Asunto, A línea y CC. UTF-8 también funcionará en la mayoría de los casos, pero no funcionará en el correo de Yahoo Japan, y como se puede imaginar, muchos usuarios japoneses utilizan el correo de Yahoo Japan.

  • Puede usar UTF-8 en el cuerpo del correo electrónico, pero se recomienda que base64 codifique el texto japonés codificado en UTF-8 y lo ponga en el cuerpo en lugar de texto UTF-8 sin formato. Sin embargo, en la práctica, creo que el texto crudo UTF-8 funcionará bien en estos días, para el cuerpo del correo electrónico.

  • Como mencioné anteriormente, debe probar al menos en Outlook (Exchange), Outlook Express (IMAP/POP3) y el correo web de Yahoo Japan. Yahoo Japan es el más complicado porque creo que usan EUC para la codificación de sus páginas web, por lo que debe seguir los estándares correctos para sus correos electrónicos o no funcionarán (ISO-2022-JP es el estándar para enviar correos electrónicos japoneses)

  • Además, su línea de asunto no debe exceder los 75 caracteres por línea. Es decir, 75 caracteres después de que ha codificado en ISO-2022-JP y base64, no 75 caracteres antes de la conversión. Si supera los 75 caracteres, debe dividir el sujeto codificado en varias líneas, comenzando con "=? Iso-2022-jp? B?" y terminando con "? =" en cada línea. Si no lo hace, su tema podría verse truncado (dependiendo del lector de correo electrónico, y también del contenido del texto del tema).De acuerdo con RFC 2047:.

"An 'palabra codificada' no puede ser más que 75 caracteres de largo, incluyendo 'charset', 'codificación', '-texto codificado', y delimitadores Si es deseable para codificar más texto del que cabrá en una 'palabra codificada' de 75 caracteres, se pueden usar múltiples 'palabras codificadas' (separadas por CRLF SPACE).

  • He aquí algunos ejemplos de código PHP para codificar el tema:

// 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. 
  • Véase RFC 2047 para una descripción completa de cómo codificar el encabezado del correo electrónico.
+1

¡Gran respuesta! Yahoo Mail no solo tiene problemas para soportar UTF-8, sino que la mayoría de los teléfonos celulares japoneses aún no admiten recibir correos electrónicos en UTF-8, por lo que estás atascado con iso-2022-jp – Elijah

+0

. En realidad, encontré los servicios de correo web y teléfonos celulares Shift-JIS bien. Es la más compacta de las codificaciones disponibles, así que vamos por eso y todavía no hemos tenido ningún problema. – bobince

+0

definitivamente es mejor quedarse con iso-2022-jp, al menos para el sujeto, ya que este es de lejos el más ampliamente compatible. especialmente en el caso de teléfonos celulares. en la mayoría de los casos, los teléfonos nuevos (especialmente los softbank) ahora son compatibles con utf-08, pero cualquier persona con más de un año de hecho, seguramente no admitirá utf-8. también tenga cuidado de mantenerse alejado de iso-2022-jp-ext.es * casi * lo mismo que iso-2022-jp pero mi experiencia es que los caracteres extendidos a menudo no son compatibles con muchos teléfonos celulares. – si28719e

2

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

ISO_2022-JP significa que la cadena está codificada en ISO-2022-JP página de códigos (por ejemplo. No Unicode) B significa que string está codificado en bese64

En su ejemplo, debe simplemente suministrar su cadena en ISO-2022-JP en lugar de Unicode.

+0

+1 para explicar la sintaxis. Gracias. – GuruM

0

En primer lugar usted debe utilizar:

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

para convertir su línea de asunto en bytes que serán procesados ​​por Convert.ToBase64String().

=? ISO-2022-JP? B? TEXTTEXT ...? = Indica al cliente de correo receptor qué codificación se usó en el lado del remitente para convertir "letras" japonesas en una secuencia de bytes.

Actualmente está utilizando UTF-16 para codificar, pero especificando ISO-2022-JP para decodificar. Evidentemente, estas son dos codificaciones diferentes, al igual que ISO-8859-1 es diferente de Unicode (la mayoría de los caracteres extendidos de Europa occidental están representados por un byte en ISO-XXX, pero dos bytes en Unicode).

No estoy seguro de lo que quiere decir que UTF-8 es un ciudadano de segunda clase. Siempre que el cliente de correo receptor entienda UTF-8 y pueda convertirlo a la configuración local japonesa actual, todo está bien.

+2

UTF-8 es definitivamente un ciudadano de segunda clase en Japón, deprimente, ya que sus propios estándares son terriblemente terribles. Los navegadores web de teléfonos celulares solo se han adaptado para su compatibilidad y todavía hay proveedores de correo web que no pueden entender el correo UTF-8 entrante. Es absolutamente patético – bobince

1

Tengo un poco de experiencia en la composición y el envío de correos electrónicos en japonés ... Normalmente, debe tener cuidado con la codificación utilizada para el sistema operativo y la forma de almacenar sus cadenas japonesas. objetos mi correo se codifican normalmente de la siguiente manera:

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 

entonces tengo un método de extensión a la que realiza la conversión para mí:

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    
     } 
1

algo como esto debería hacer el trabajo en 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]" 

** descaradamente robada/adaptado de:

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

0
<?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; 
} 
0

Introducción de codificación japonesa a correo -mail se produjo en JUNET (red nacional basada en UUCP) a principios de los 90.

En ese momento, se definió RFC1468. Si sigue RFC1468 en correo de texto sin formato, no habría ningún problema.

Si desea manejar correo html, RFC1468 es inútil a excepción de las partes del encabezado.

0

Esto es lo que uso para enviar correos electrónicos en japonés. La línea de asunto se ve bien en Outlook 2010, gmail y en 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"); 
Cuestiones relacionadas