使用Java在纯文本中编写耸肩的ASCII表情 ¯\_(ツ)_/¯

9

我正在开发一个Java程序,将输出写入文本文件。当出现问题时,我必须放置这个ASCII艺术:

¯\_(ツ)_/¯

我用了这个BufferedOutputStream来实现:

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

问题在于,当我看到用Java编写的txt日志时,我会看到以下内容:
##################################
#####       Error Output    ######
#####       ¯\_(ツ)_/¯       ######
##################################

我该如何在Java中正确书写ASCII表情符号?


1
首先,这绝不是ASCII。 - Jon Skeet
1
哦,还有楼主:如果你还没有读过这篇文章,我强烈推荐你阅读一下:http://www.joelonsoftware.com/articles/Unicode.html(不是要刻意苛刻,但它可能会消除现在和未来的很多困惑)。 - yshavit
3个回答

6

.java文件以UTF-8编码保存,这段代码可以正常工作:

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

输出:

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

DEMO HERE.


2

该文件采用UTF-8编码,但您正在使用单字节编码查看:

  • 您会看到UTF-8多字节序列的特殊字符,每个字符占一个字节。

请确保以UTF-8格式阅读它,因为您确实使用了非ASCII、类逗号引号和日语。所以UTF-8是可以的。

在Windows下的一个小技巧是:

String string = "\uFEFF##...

这段代码写入了一个Unicode BOM字符,当该字符位于文件的开头时,它会被解释为Unicode标记。

否则,需要创建一个指定字符集的HTML文件:

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

在类似于Windows的非UTF-8系统上,无法在控制台(System.out)上显示内容。
此外,为了使你的应用程序具有可移植性,请确保指定写入的编码方式。通常,它是一个可选参数,并且带有被覆盖的方法/构造函数。

我尝试指定编码但没有成功:Charset.forName("UTF-8").encode(string); errorOutput.writeln(string); - NullPointerException
new OutputStreamWriter(outputStream, "UTF-8") 是将文本(String,Writer)转换为字节(byte[],OutputStream)的多种可能性之一,其中在Java中始终是Unicode。但是文件似乎已经很好了,因为它是UTF-8编码。编辑器只需要知道它是UTF-8编码即可。建议使用JEdit或Notepad++。 - Joop Eggen
1
Charset.forName("UTF-8").encode(string); errorOutput.writeln(string);---这显然是错误的。你忽略了encode的返回值,然后只是将之前的相同字符串发送到errorOutput中。顺便说一下,为了使其工作,errorOutput必须是一个OutputStream而不是一个Writer - Marko Topolnik

0
用以下代码片段解决:
@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();

getStdErr() 只会返回表情符号吗? - riddle_me_this

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接