JSP:相同的代码和相同的输入,但输出不同? UTF-8 BOM问题

时间:2016-03-09 04:06:11

标签: java jsp utf-8

首先让我展示代码:

Java类:

package test;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class Reader {
    public static void main(String[] args) {
        show("test.txt");
    }

    public static void show(String fileName) {
        StringBuilder data = new StringBuilder();
        try (BufferedReader reader = new BufferedReader(new FileReader(fileName))) {
            while (reader.ready())
                data.append(reader.readLine()).append("\n");
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println(data);
        for (int i=0; i<data.length(); i++)
            System.out.println(data.codePointAt(i));
    }
}

JSP:

<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ page pageEncoding="UTF-8"%>
<%@ page import = "test.*" %>

<html>
<head></head>
<body>
<% Reader.show("test.txt"); %>
</body>
</html>

测试文件 test.txt 采用UTF-8 with BOM编码,包含四个可见字符:&#34; TEST&#34;。您可以自己创建或下载here

Reader类只显示文件每个字符的内容和代码点 也就是说,它应该打印TEST和代码点65279 84 69 83 84 10,其中65279是BOM字符,10是新行字符。

但是,我在JSP中执行相同的代码,输出为嚜燜EST,代码点为22172 29148 69 83 84 10。这很奇怪,我无法弄清楚原因。

1 个答案:

答案 0 :(得分:0)

我认为这应该是一个字符集问题,将这行代码添加到show()System.out.println(Charset.defaultCharset().name());的开头。运行Reader类和JSP页面以检查是否存在任何差异。

<强>更新
我已经下载了您的test.txt文件,并在Mac OS X下使用JDK 1.8.0_45,Tomcat 8.0.32测试了您的代码,两者都提供了相同的输出。