Wie Sie festlegen, Antwort-header, die in JAX-RS so, dass die chinesischen chars sind richtig angezeigt in der benutzerdefinierten generierten Datei
Wie würde ich es richtig generiert eine "javax.ws.rs.core.Antwort" (Rückgabe) unterstützt die Codierung chinesischer Zeichen in einer Excel-Datei?
Zu verdeutlichen, habe ich eine Datei im CSV-Format (excel) enthält einige chinesische Inhalte, und ich brauche, um wieder eine javax Antwort, die zeigt dann die chinesischen Zeichen in das Dokument richtig (auf der client-Seite).
Zurzeit mache ich Folgendes:
return Response.status( 200 )
.header( "content-disposition",
"attachment;filename=SampleCSV.csv;charset=Unicode" )
.entity( result )
.build();
aber, wenn diese Antwort wird erstellt und zurückgegeben der client-Seite (und ein popup-Fenster mit der Frage angezeigt, um die Datei herunterzuladen), die chinesische Inhalte der excel-Datei ist gobbly gooed.
Jeder Vorschlag wird sehr geschätzt werden.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den RFC definiert, der content-disposition-header nicht erwähnt, ein charset-Klausel
Versuchen Sie auch das hinzufügen einer richtigen content-type-header der Antwort:
Sicher sein, um die Verwendung von utf-8, nicht unicode. Wenn das funktioniert, dann Sie können entfernen Sie die
charset
- Klausel aus der content-disposition-header.Geben Sie
charset=Unicode
, die nicht gültig ist, weil die Unicode nicht eine einzelne Codierung. Es ist ein Zeichen mit einer Familie von Codierungen. UTF-8 und UTF-16 sind Häufig verwendete Kodierungen.Können Sie Steuern, response-header, um zu beeinflussen, wie der browser/client interpretiert die Antwort, mit der
@Produces
annotation. Ich habe gesehen, verschiedene Meinungen darüber, ob dies funktioniert:Ich bin ziemlich sicher, dass diese änderungen, die nur die Codierung erklärt in den Antwort-Headern; es ändert nichts an der Codierung, die tatsächlich verwendet zum konvertieren der Antwort-string in bytes zu senden über das Netzwerk. Diese beiden müssen übereinstimmen, da sonst der browser/client falsch, die Antwort, weil Sie glaubt, dass Sie eine andere Codierung, als Sie eigentlich haben.
Wenn Sie wieder eine java.lang.String-Objekt, JAx-RS verwendet ein system mit Standard-Kodierung konvertieren, um ein byte-stream. Wenn die JAX-RS-server läuft auf Unix ist dies UTF-8, die in der Regel gut funktioniert, aber auf Windows ist es etwas seltsam, dass nicht.
Deshalb sollten Sie die Kraft, die Verwendung einer bestimmten Codierung, durch die Verpackung des Ergebnis-Objekts in ein
OutputStreamWriter
legt fest, dass die Codierung. Dies verhindert, dass JAX-RS aus der Verwendung der Standardeinstellungen für die Konvertierung.Genau zu sein, wenn
result
ist ein auf java.lang.String-Objekt in Ihrem code, müssen Sie möglicherweise erstellen einen OutputStreamWriter, um das alles gibt ein encoding wie UTF-8, zu beeinflussen byte-stream, der JAX-RS schreibt das Netzwerk. Habe ich noch nicht getestet mit diesem code, aber es könnte funktionieren:Hatte ich dieses problem mit Tika, die sendet eine
StreamingOutput
statt einerResponse
, und baut es mit einem Standard -OutputStreamWriter
verwendet das system die Standard-Codierung statt der etwas vorhersehbar.Ich geändert Tika, um die Kodierung angeben, die bei der Konstruktion der
OutputStreamWriter
, und fügte hinzu, einecharset
zu den@Produces
annotation, und fixiert es für mich.