Java字符串编码在调试模式下正确,但在日志和网络请求中错误

Java字符串编码在调试模式下正确,但在日志和网络请求中错误,java,string,encoding,utf-8,character,Java,String,Encoding,Utf 8,Character,我有一个奇怪的bug,我已经调试了两天了。我的服务器构造了一个表示HTML文件的字符串,并将其发送到另一个API以转换为PDF文件。但是,所有像中文这样的外来字符都将转换成问号 我在调试模式下查看这些变量,它们看起来都很好,但是当它被发送时,它将被更改为问号。我试过了 新字符串(originalString.getBytes(),StandardCharsets.UTF_8) 此构造函数返回的值也会使所有汉字都打上问号 我可以在调试模式下正常查看带有断点的原始字符串,但我无法记录它们或Syste

我有一个奇怪的bug,我已经调试了两天了。我的服务器构造了一个表示HTML文件的字符串,并将其发送到另一个API以转换为PDF文件。但是,所有像中文这样的外来字符都将转换成问号

我在调试模式下查看这些变量,它们看起来都很好,但是当它被发送时,它将被更改为问号。我试过了

新字符串(originalString.getBytes(),StandardCharsets.UTF_8)
此构造函数返回的值也会使所有汉字都打上问号

可以在调试模式下正常查看带有断点的原始字符串,但我无法记录它们或
System.out.println()
它们。打印的字符串将把所有外来字符变成问号

我试着查看字符串,正确的字符串有364号槽作为汉字,代码为20000左右,但是当它们被转换时,它们变为
,代码为63

我确实将控制台字符设置为UTF-8

这就是我发送到另一个API的方式 仅供参考,这是一些随机人编写的旧遗留代码。为糟糕的风格道歉

String htmlData = princeServices.createPdf(pdfData, teacher, connection);
htmlData = tidyHTML(htmlData, pdfData); // This is the html data, can be viewed in debug mode

URL urlobj = null;
if ("Landscape".equalsIgnoreCase(pdfData.getPrintLayout())) {
     urlobj = new URL(princePath + "Landscape");
} else {
     urlobj = new URL(princePath);
}
            HttpURLConnection conn = (HttpURLConnection) urlobj.openConnection();
            HttpURLConnection.setFollowRedirects(true);
            conn.setRequestMethod("POST");
            conn.setDoOutput(true);
            conn.setRequestProperty("Authorization", "Basic " + printBase64Binary(/* password here */ );
            conn.setRequestProperty("Content Length", Integer.toString(htmlData.length()));
            outToPrinceServer = new OutputStreamWriter(conn.getOutputStream());
            outToPrinceServer.write(htmlData);
            outToPrinceServer.flush();
            resp.setContentType("application/pdf");
            resp.addHeader("Content-Disposition", "attachment; filename=" + "planbook.pdf");
            ServletOutputStream outToBrowser = resp.getOutputStream();
            ByteStreams.copy(conn.getInputStream(), outToBrowser);
拯救我的生命请:)

System.out.println()
正在使用“本地”控制台,这意味着根据您的操作系统语言,它不会显示特殊字符


有关更多信息,请参阅此答案:

字符串没有编码。编码用于确定字符将转换到/从哪个字节。当您将它发送到其他API时,它很可能已损坏。“你是怎么做到的?”卡亚曼补充道question@KayamanoutputStream.getEncoding()给了我CP1252我太醉了,无法一直帮助你,但是你必须始终使用
OutputStreamWriter
的构造函数,它也需要一个字符集,你不想依赖默认值在任何地方都是一样的。可能还会在其中添加一个。