我的简单Java HTTPServer中的特殊字符编码

问题描述 投票:1回答:1

我有一个简单的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应用程序每隔几秒就会循环打印一行(就像它试图发送数据一样,但是可能无法阻止它!)。但我没有在应用程序上得到任何异常或错误(我记录所有可能的错误)。

enter image description here

我对这种行为感到很困惑。这是怎么回事?!

首先,为什么我得到的是依赖于我运行Java应用程序的环境?!如果Windows命令提示符/ Powershell将字符显示为?,我希望它只是在本地显示它。我为什么要在浏览器上看到??! Java应用程序必须独立于环境。

第二,当请求具有此字符的行时,Linux / Eclipse环境中的错误是怎么回事?

java character-encoding special-characters outputstream com.sun.net.httpserver
1个回答
1
投票

可以预测的问题与getBytes()UTF-8字符串表示有关。以下是否完美:

        he.sendResponseHeaders(200, response.getBytes("UTF-8").length);
        OutputStream os = he.getResponseBody();
        os.write(response.getBytes("UTF-8"));
© www.soinside.com 2019 - 2024. All rights reserved.