我有一个简单的 Java 应用程序,基本上是一个使用 com.sun.net.HttpServer API 实现的服务器,它读取文件并在经过一些处理后简单地发回文本。服务器部分如下所示:
server = HttpServer.create(new InetSocketAddress(serverPort), 0);
logger.info("EventRetriever REST server listening to port: " + serverPort);
server.createContext("/getEvents", new MedatadaHandler());
server.setExecutor(null);
server.start();
// ...
@Override
public void handle(HttpExchange he) throws IOException {
//...
String response = requestEvents();
he.sendResponseHeaders(200, response.length());
OutputStream os = he.getResponseBody();
os.write(response.toString().getBytes());
os.close();
}
//...
public String requestEvents(){
//...
// this printing on the console looks fine though:
logger.info(jsonString);
return jsonString;
}
我在命令行或 IDE 上使用 java -jar myApp.jar
运行我的 jar
文件。当需要发送包含特殊字符(例如音乐符号 ♪
)的文本时,我目睹了一些奇怪的行为,有时只是挂起。当我通过浏览器调用 IP:PORT/getEvent
时,行为非常奇怪:
如果我在 Windows Powershell 或命令提示符下运行它,该符号在控制台上显示为 ?
,并且我从浏览器获取的内容也显示为 ?
。但是,当我在 Linux 服务器或 Eclipse IDE 上运行该程序时,它在控制台上正确显示(如 ♪
),但在浏览器上,我收到以下错误,尽管状态为 200 OK
。我在控制台上看到java应用程序每隔几秒就循环打印该行(就好像它正在尝试发送数据,但不可能有什么东西阻止了它!)。但我在应用程序上没有收到任何异常或错误(我记录了所有可能的错误)。
我对这种行为感到非常困惑。这是怎么回事?!
首先,为什么我得到的结果取决于我运行 Java 应用程序的环境?!如果 Windows 命令提示符/Powershell 将字符显示为 ?
,我希望它只是在本地显示它。为什么我在浏览器上也将其视为 ?
?! Java应用程序必须独立于环境。
其次,当请求具有此字符的行时,Linux/Eclipse 环境中的错误是怎么回事?
最佳答案
可以预见,该问题与 getBytes()
和 UTF-8
字符串表示形式有关。执行了以下操作,然后一切都很好:
he.sendResponseHeaders(200, response.getBytes("UTF-8").length);
OutputStream os = he.getResponseBody();
os.write(response.getBytes("UTF-8"));
关于java - 我的简单 Java HTTPServer 中的特殊字符编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54896555/