我使用 Java 程序从网站下载文件,标题如下所示
Content-Disposition attachment;filename="Textkürzung.asc";
Run Code Online (Sandbox Code Playgroud)
没有指定编码
我所做的是下载后将文件名传递给另一个应用程序以进行进一步处理。我用
System.out.println(filename);
Run Code Online (Sandbox Code Playgroud)
在标准输出中,字符串打印为 Textk³rzung.asc
如何在 Java 中将标准输出更改为“UTF-8”?
我尝试编码为“UTF-8”,内容还是一样
更新:
我能够在没有任何代码更改的情况下解决这个问题。在我从其他应用程序调用它的 jar 文件的地方,我执行了以下操作
java -DFile.Encoding=UTF-8 -jar ....
这似乎解决了这个问题
谢谢大家的支持
小智 5
尝试使用:
PrintStream out = new PrintStream(System.out, true, "UTF-8");
out.println(test);
Run Code Online (Sandbox Code Playgroud)
您看到的结果表明您的控制台希望文本采用 Windows“代码页 850”编码 - 字符 ü 具有 Unicode 代码点 U+00FC。字节值 0xFC 在 Windows 代码页 850 中呈现为 ³。因此,如果您希望名称在控制台上正确显示,则需要使用编码“Cp850”来打印它:
PrintWriter consoleOut = new PrintWriter(new OutputStreamWriter(System.out, "Cp850"));
consoleOut.println(filename);
Run Code Online (Sandbox Code Playgroud)
这是否是您的“其他应用程序”所期望的是一个不同的问题 - 其他应用程序只有在将其标准输入读取为 Cp850 时才会看到正确的名称。
的默认编码System.out是操作系统默认值。在国际版本的 Windows 上,这通常是 windows-1252 代码页。如果您在命令行上运行代码,这也是终端期望的编码,因此可以正确显示特殊字符。但是,如果您以其他方式运行代码,或者将输出发送到文件或其他程序,则可能需要不同的编码。在您的情况下,显然是 UTF-8。
您实际上可以System.out通过替换它来更改编码:
try {
System.setOut(new PrintStream(new FileOutputStream(FileDescriptor.out), true, "UTF-8"));
} catch (UnsupportedEncodingException e) {
throw new InternalError("VM does not support mandatory encoding UTF-8");
}
Run Code Online (Sandbox Code Playgroud)
这适用于PrintStream不能使用 new 的情况,例如因为输出来自您无法更改的库代码,并且您无法控制系统属性,或者更改所有文件的默认编码不合适.