2016-11-29 6 views
3

Ich erhalte eine Ausnahme, begraben Art und Weise in einem 3rd-Party-Bibliothek, mit einer Nachricht wie folgt aus:Gibt es eine Möglichkeit Aliase für Charset Namen Java hinzufügen

java.io.UnsupportedEncodingException: BIG-5

Ich denke dies passiert, weil Java diesen Namen für nicht definiert. Charset.forName("big5") ist in Ordnung, aber Charset.forName("big-5") wirft die Ausnahme. (Alle diese Namen erscheinen Fall unempfindlich sein.)

Dies unterscheidet sich von „utf-8“, die einige Aliase hat toleranter zu sein. Zum Beispiel können sowohl Charset.forName("utf8") und Charset.forName("utf-8") funktionieren.

Frage: Gibt es einen Weg, um den Alias, so dass „big5“ Karten „big5“ hinzufügen?

+0

Ist die Drittanbieter-Bibliothek Java Mail durch Zufall? – dnault

+0

Machen Sie eine Konstante irgendwo mit 'private static final Charset BIG5_CHARSET = Charset.forName ("big5")'? Du hast kein Problem mehr. Oder sagst du, dass das ein Code ist, den du nicht kontrollierst? – Tunaki

+0

Woher kommen die Zeichensatznamen? Können Sie sie abfangen und kanonisieren? – dnault

Antwort

2

können Sie versuchen, die mail.mime.contenttypehandler Systemeigenschaft:

In einigen Fällen Java Mail nicht in der Lage ist, Nachrichten mit einem ungültigen Content-Type-Header zu verarbeiten. Der Header kann eine falsche Syntax oder andere Probleme haben. Diese Eigenschaft gibt den Namen einer Klasse an, die zum Bereinigen des Inhaltstyp-Headerwerts verwendet wird, bevor sie von JavaMail verwendet wird. Die Klasse muss eine Methode mit dieser Signatur haben: public static String cleanContentType (Mimepart mp, String content) Immer dann, wenn Java Mail den Content-Type-Header einer Nachricht zugreift, wird es den Wert dieser Methode übergeben und den zurückgegebenen Wert stattdessen verwenden.

Ein Beispiel hierfür ist:

import java.util.Arrays; 
import javax.mail.Session; 
import javax.mail.internet.ContentType; 
import javax.mail.internet.MimeMessage; 
import javax.mail.internet.MimePart; 

public class FixEncodingName { 

    public static void main(String[] args) throws Exception { 
     MimeMessage msg = new MimeMessage((Session) null); 
     msg.setText("test", "big-5"); 
     msg.saveChanges(); 
     System.out.println(msg.getContentType()); 
     System.out.println(Arrays.toString(msg.getHeader("Content-Type"))); 
    } 

    public static String cleanContentType(MimePart p, String mimeType) { 
     if (mimeType != null) { 
      String newContentType = mimeType; 
      try { 
       ContentType ct = new ContentType(mimeType); 
       String cs = ct.getParameter("charset"); 
       if ("big-5".equalsIgnoreCase(cs)) { 
        ct.setParameter("charset", "big5"); 
        newContentType = ct.toString(); 
       } 
      } catch (Exception ignore) { 
       newContentType = newContentType.replace("big-5", "big5"); 
      } 

      /*try { //Fix the header in the message. 
       p.setContent(p.getContent(), newContentType); 
       if (p instanceof Message) { 
        ((Message) p).saveChanges(); 
       } 
      } catch (Exception ignore) { 
      }*/ 
      return newContentType; 
     } 
     return mimeType; 
    } 
} 

Wenn mit -Dmail.mime.contenttypehandler=FixEncodingName Willen Ausgang laufen:

text/plain; charset=big5 
[text/plain; charset=big-5] 
Verwandte Themen