我的简单 Java HTTPServer 中的特殊字符编码
Special character encoding in my simple Java HTTPServer
我有一个简单的 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;
}
我 运行 我的 jar
文件 java -jar myApp.jar
在命令行上或只是在我的 IDE 上。我目睹了一些奇怪的行为,有时只是挂起,当它需要发送包含特殊字符的文本时,例如音乐符号 ♪
。当我通过浏览器调用 IP:PORT/getEvent
时,行为很奇怪:
如果我在 Windows Powershell 或命令提示符上 运行 它,该符号在控制台上显示为 ?
,我从浏览器获得的内容也显示为 ?
。但是当我 运行 linux 服务器或我的 Eclipse IDE 上的程序时,它在控制台上正确显示(如 ♪
),但在浏览器上,我得到以下错误,尽管状态为 200 OK
。我在控制台上看到 java 应用程序每隔几秒就循环打印一行(好像它正在尝试发送数据,但可能有什么东西阻止了它!)。但是我在应用程序上没有遇到任何异常或错误(我记录了所有可能的错误)。
我对这种行为感到很困惑。怎么回事?!
首先,为什么我得到的东西取决于我 运行 我的 Java 应用程序的环境?!如果 Windows 命令 Prompt/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 应用程序,基本上是一个使用 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;
}
我 运行 我的 jar
文件 java -jar myApp.jar
在命令行上或只是在我的 IDE 上。我目睹了一些奇怪的行为,有时只是挂起,当它需要发送包含特殊字符的文本时,例如音乐符号 ♪
。当我通过浏览器调用 IP:PORT/getEvent
时,行为很奇怪:
如果我在 Windows Powershell 或命令提示符上 运行 它,该符号在控制台上显示为 ?
,我从浏览器获得的内容也显示为 ?
。但是当我 运行 linux 服务器或我的 Eclipse IDE 上的程序时,它在控制台上正确显示(如 ♪
),但在浏览器上,我得到以下错误,尽管状态为 200 OK
。我在控制台上看到 java 应用程序每隔几秒就循环打印一行(好像它正在尝试发送数据,但可能有什么东西阻止了它!)。但是我在应用程序上没有遇到任何异常或错误(我记录了所有可能的错误)。
我对这种行为感到很困惑。怎么回事?!
首先,为什么我得到的东西取决于我 运行 我的 Java 应用程序的环境?!如果 Windows 命令 Prompt/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"));