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

标签 java character-encoding special-characters outputstream com.sun.net.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;
}

我在命令行或 IDE 上使用 java -jar myApp.jar 运行我的 jar 文件。当需要发送包含特殊字符(例如音乐符号 )的文本时,我目睹了一些奇怪的行为,有时只是挂起。当我通过浏览器调用 IP:PORT/getEvent 时,行为非常奇怪:

如果我在 Windows Powershell 或命令提示符下运行它,该符号在控制台上显示为 ?,并且我从浏览器获取的内容也显示为 ? 。但是,当我在 Linux 服务器或 Eclipse IDE 上运行该程序时,它在控制台上正确显示(如 ),但在浏览器上,我收到以下错误,尽管状态为 200 OK。我在控制台上看到java应用程序每隔几秒就循环打印该行(就好像它正在尝试发送数据,但不可能有什么东西阻止了它!)。但我在应用程序上没有收到任何异常或错误(我记录了所有可能的错误)。

enter image description here

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

首先,为什么我得到的结果取决于我运行 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/

相关文章:

java - 使用短信自动响应来电

swift - 字符无法转换为字符串

Linux 机器上存在 PHP file_exists 和特殊字符,如 Å Ø Æ

html - 尝试调整表中列表中▲▼符号的大小,但字体大小无效

java - 我如何使多个replace() java

java - 在 MVC 请求完成之前,Hibernate 事务不会启动

java - Android 开发 Eclipse - 无法创建新的 Android 项目 - Mac OS

java - 是在循环中的函数调用附近 sleep 还是在函数调用本身中更清楚?

java - 中文 UTF-8 字符在 Weblogic 10.3 中显示不正确,但在 Tomcat 6 中则不然

php - 不使用utf8编码显示汉字?