Java 我如何才能将标准更改为“输出”;UTF-8“;在爪哇

Java 我如何才能将标准更改为“输出”;UTF-8“;在爪哇,java,Java,我使用Java程序从网站下载了一个文件,标题如下所示 Content-Disposition attachment;filename="Textkürzung.asc"; 没有指定编码 我所做的是在下载后将文件名传递给另一个应用程序进行进一步处理。我用 System.out.println(filename); 在标准输出中,字符串打印为Textk³rzung.asc 如何在Java中将标准更改为“UTF-8” 我试着编码成“UTF-8”,但内容还是一样的 更新: 我能够在没有任何代码更改的

我使用Java程序从网站下载了一个文件,标题如下所示

Content-Disposition attachment;filename="Textkürzung.asc";
没有指定编码

我所做的是在下载后将文件名传递给另一个应用程序进行进一步处理。我用

System.out.println(filename);
在标准输出中,字符串打印为
Textk³rzung.asc

如何在Java中将标准更改为“UTF-8”

我试着编码成“UTF-8”,但内容还是一样的

更新:

我能够在没有任何代码更改的情况下修复此问题。在我从另一个应用程序调用这个jar文件的地方,我做了以下操作

java-DFile.Encoding=UTF-8-jar….

这似乎解决了这个问题

感谢大家的支持

尝试使用:

 PrintStream out = new PrintStream(System.out, true, "UTF-8");
out.println(test);

您看到的结果表明,您的控制台希望文本采用Windows“code page 850”编码-字符U具有Unicode代码点U+00FC。字节值0xFC在Windows代码页850中呈现为3。因此,如果希望名称正确显示在控制台上,则需要使用编码“Cp850”打印:


这是否是您的“其他应用程序”所期望的是另一个问题-只有当其他应用程序也将其标准输入读取为Cp850时,它才会看到正确的名称。

系统的默认编码。是操作系统的默认编码。在国际版本的Windows上,这通常是Windows-1252代码页。如果您在命令行上运行代码,这也是终端所期望的编码,因此可以正确显示特殊字符。但是,如果以其他方式运行代码,或者将输出发送到文件或其他程序,则可能需要不同的编码。就你而言,显然是UTF-8

实际上,您可以通过替换
System.out
来更改其编码:

试试看{
系统设置(新的PrintStream(新的FileOutputStream(FileDescriptor.out)),true,“UTF-8”);
}捕获(不支持的编码异常e){
抛出新的内部错误(“VM不支持强制编码UTF-8”);
}

这适用于不能选择使用新的
打印流的情况,例如,因为输出来自您无法更改的库代码,您无法控制系统属性,或者更改所有文件的默认编码不合适。

您需要正确读取输入。然后你只需打印文件。如果您试图将非UTF-8的文件打印到standard out,您将再次收到垃圾。您不能从Java端“将standard out更改为UTF-8”,而是需要确定编码standard out需要什么,然后确保在打印字符串时使用Java编码。在打印之前设置断点并检查变量…它是否正确显示在那里?如果是这样,您可能需要更改IDE设置以在控制台中正确显示UTF-8。作为参考,Unicode中的U是U+00FC,字节0xFC对应于Windows代码页850中的³。重要的问题是:如何创建字符串
文件名
?所有Java字符串都是Unicode格式的,所以打印它应该可以正常工作(除非系统上未正确配置
System.out
)├╝rzung_u2;.asc
@KarthikKrishnan这将UTF-8写入控制台。然而,终端只了解ANSI(可能)的一些变化,而不了解UTF-8。将输出重定向到一个文件,然后在UTF-8感知编辑器中打开该文件,应该会显示“正确的文本”。我在那里也有这个。我想修好这个房间stream@KarthikKrishnan书写正确;读数(或查看)不正确。使用
java theprogram>thefile.txt
,然后在wordpad.exe(不是记事本!)中打开“thefile.txt”进行验证。@KarthikKrishnan“其他应用程序”需要正确读取它(UTF-8),然后正确显示它(使用正确的字体,从UTF-8正确解码为Unicode)。上面的文件重定向示例表明Java正确地完成了它的一部分——“其他应用程序”没有正确地读取UTF-8中的字节流(或者没有正确地显示为Unicode,例如,如果“其他应用程序”直接写入控制台)。如前所述,command.com/cmd.exe不支持UTF/Unicode。使用这种方法,标准数据流中的数据是UTF-8,正如所要求的。我不确定我是否正确理解了您的意思。我们拥有的另一个应用程序(BPEL流程)正在调用Java JAR并等待响应(stdout)。这两个应用程序所在的(windows)服务器具有代码页850。我真的不知道我还应该做什么来设置代码页。PrintWriter也会写入文件,而不会写入console@KarthikKrishnan如果您将此Java程序的输出管道化到另一个流程(BPEL引擎),那么您可以忽略在独立运行时控制台上的外观。重要的是,您在Java流程中用于将内容写入标准输出的编码与BPEL引擎用于读取它的编码相同。如果这是您可以在BPEL端配置的内容,那么请将双方配置为使用UTF-8以实现最大兼容性。如果不是,那么您需要找出BPEL期望的编码,然后让您的Java程序使用相同的编码。它可能会在某些时候起作用。您正在用另一种编码包装一种编码。在编码到Cp850之后,字节需要直接传递到FileDescriptor.out。我认为这是正确的答案。编码到UTF-8,然后将编码的字节直接输出到FileDescriptor。由于双重编码,其他两个投票结果较高的解决方案可能会遇到间歇性问题。
PrintWriter consoleOut = new PrintWriter(new OutputStreamWriter(System.out, "Cp850"));
consoleOut.println(filename);