2016-06-04 4 views
0

In der API eines Dokuments Wandler enthalten, die HTML (oder XHTML) erzeugt, möchte ich diese Methoden entlarven:API-Design für Java String Ergebnisse, die charset spezifische Daten

// Convert the input file to a file using the specified charset 
void convert(File in, File out, Charset charset); 

// Convert the input document to a string using the specified charset 
String convert(String in, Charset charset); 

Es gibt keine Möglichkeit für Client-Code, um fehlerhafte Dokumente mit der dateibasierten Methode zu erzeugen, schreibt er sicher ein Ergebnisdokument mit dem angegebenen Zeichensatz.

Die String-basierte Methode führt offensichtlich zu Problemen, wenn der Client-Code den gewählten Zeichensatz nicht berücksichtigt - zum Beispiel wenn der Zeichensatzparameter ISO-8859-1 ist, aber das Ergebnis String als UTF-8-Inhalt in a Web-Anwendung:

String html = convert(getInputDocument(), ISO_8859_1); 
... 
response.setContentType("text/html;charset=UTF-8"); 
response.setCharacterEncoding("UTF-8"); 

try (PrintWriter out = response.getWriter()) { 
    out.print(html); 
} 

Frage: welche Optionen soll ich die API so zu gestalten, dass die Benutzer geführt werden Nutzung der Ergebnis-Strings zu korrigieren?

  • deprecate des Verfahrens und ein Verfahren bereitzustellen, das
  • Verwendung Methodennamen ein Byte-Array zurückgibt, die die Kodierung enthalten (convertToUTF_8, convertToISO_8859_1 ...)

Der String Ergebnis könnte für Beispiel sein

<!DOCTYPE html> 
<html> 
    <head> 
    <META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
    <title>Untitled document</title> 
    </head> 
    <body> 
    <p>Mot&ouml;rhead</p> 
    </body> 
</html> 

Antwort

0

Ich kenne Ihren genauen Anwendungsfall nicht, aber eine Möglichkeit ist Dokument mit einem richtigen Objektkontext zu schützen (statt es nur ein String sein):

public interface Document { 
    void writeTo(ServletResponse response); 
} 

Auf diese Weise können Sie alle Kontrolle behalten, wie das „string“ kann auf verschiedene Ziele geschrieben werden.

Ich bin mir nicht sicher, ob Sie eine convert überhaupt benötigen, da das Dokument seinen Inhalt automatisch konvertieren könnte, wenn es sieht, dass die Antwort bereits eine andere Codierung hat. Aber auch wenn Sie ein convert benötigen könnten Sie es auf diese Weise tun:

public interface Document { 
    void writeTo(ServletResponse response); 

    Document convert(Charset targetCharset); 
} 

Dies würde ein neues Dokument zurück, die aus einem anderen Zeichensatz ist.

Verwandte Themen