2015-08-26 12 views
5

Ich entwickle ein Java-Programm, das Ausgabe in eine Textdatei schreibt. Wenn etwas schief geht, muss ich diese ASCII-Art setzen:Probleme writting Achselzucken Emoji ¯ _ (ツ) _/¯ im Klartext mit Java

¯\_(ツ)_/¯ 

Ich habe es mit diesem BufferedOutputStream:

errorOutput.writeln("##################################\n" 
        + "#####  Error Output  ######\n" 
        + "#####  ¯\\_(ツ)_/¯  ######\n" 
        + "##################################\n"); 

Das Problem ist, dass, wenn ich das txt-Log sehen writted mit Java-i diese:

################################## 
#####  Error Output ###### 
#####  ¯\_(ツ)_/¯  ###### 
################################## 

Wie kann ich die richtige ASCII Emojis in Java schreiben?

+0

Wie haben Sie diese Textdatei angezeigt? Ich denke, es ist eine Art von Unicode zu Ascii Problem. Versuchen Sie es mit Unicode-Einstellungen anzeigen (Notepad ++) – moffeltje

+0

in Navigator (Chrom) – NullPointerException

+0

Swap die Dateicodierung zu UTF-8, welche IDE verwenden Sie? – IanGabes

Antwort

0

mit diesem Code-Schnipsel gelöst:

@GET 
    @Path("getStdErr/{idApp}") 
    @Produces("text/html; charset=UTF-8") 
    public Response getStdErr(@PathParam("idApp") Integer idApp) { 
     return super.getStderr(jobsMap.get(idApp)); 
    } 

. . . .

return Response.ok(job.getStdErr(), "text/plain; charset=UTF-8").build(); 
+0

Würde 'getStdErr()' nur die Emoji zurückgeben? – bphilipnyc

4

Speichern der .java Datei als UTF-8 dieser Code funktioniert für mich:

String string = "##################################\n" 
      + "#####  Error Output  ######\n" 
      + "#####  ¯\\_(ツ)_/¯  ######\n" 
      + "##################################\n"; 
Charset.forName("UTF-8").encode(string); 
System.out.println(string); 

OUTPUT:

################################## 
#####  Error Output  ###### 
#####  ¯\_(ツ)_/¯  ###### 
################################## 

DEMO HERE.

+0

das Problem ist nur, wenn ich die txt-Datei im Navigator, Chrome Firefox usw. öffnen ... diese Java-App es auf einem Server ausgeführt wird, so dass die Protokolldatei in einem Navigator öffnet – NullPointerException

+0

@ AndroidUser99 haben Sie die Header für die Webseite? – Cosmin

+0

es ist keine Webseite, es ist nur eine Text-Ebene txt-Datei – NullPointerException

2

Die Datei ist in UTF-8, aber Sie sehen es in einer Single-Byte-Codierung:

  • Sie sind UTF-8 Multi-Byte-Sequenzen für Sonderzeichen mit einem Zeichen pro Byte zu sehen.

Stellen Sie sicher, dass Sie es als UTF-8 zu lesen, weil man in der Tat nicht-ASCII verwenden, Komma-like, Zitate und Japanisch. Also UTF-8 ist in Ordnung.

Ein schmutziger Trick unter Windows wäre:

String string = "\uFEFF##... 

Dieser einen Unicode-BOM char schreibt, die, wenn sie das erste Zeichen einer Datei als Unicode-Markierung interpretiert wird.

Ansonsten eine HTML-Datei mit charset erstellen angegeben:

<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></head> 
<body><pre>...</pre></body></html> 

auf der Konsole angezeigt, System.out, ist nicht möglich, auf einem Nicht-UTF-8-System wie Windows.

Auch für Ihre Anwendung portabel sein, stellen Sie sicher, dass Sie die Codierung für das Schreiben angeben; es ist oft ein optionales Argument mit einer überschriebenen Methode/Konstruktor.

+0

Ich versuchte, die Codierung anzugeben, aber nicht funktioniert: Charset.forName ("UTF-8"). Encode (string); \t \t \t errorOutput.writeln (string); – NullPointerException

+0

'new OutputStreamWriter (outputStream," UTF-8 ")' ist eine von vielen Möglichkeiten, um eine Umwandlung für Text ('String, Writer') (die in Java immer Unicode ist) zu Bytes (' byte [], OutputStream) zu haben '). Aber die Datei scheint schon in Ordnung, als UTF-8. Der Editor muss nur wissen, dass es UTF-8 ist. Verwenden Sie JEdit oder Notepad ++. –

+1

'Charset.forName (" UTF-8 "). Encode (string); errorOutput.writeln (string); '--- das ist eindeutig falsch. Du ignorierst den Rückgabewert von 'encode', dann sendest du die gleiche Zeichenfolge wie zuvor in 'errorOutput'. Und btw 'errorOutput' müsste ein' OutputStream' sein, kein 'Writer', damit das funktioniert. –