为什么在java 6和java 7中获得character®(U + 00AE)是不同的?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么在java 6和java 7中获得character®(U + 00AE)是不同的?相关的知识,希望对你有一定的参考价值。

这是我第一次在StackOverFlow上询问。我英语说的不好。请原谅我。

我有一个问题,我的应用程序返回一个奇怪的角色。

PlayStation ufffd ufffd4 Pro

它必须是这样的:

PlayStation®4专业版

我认为' ufffd'字符代表this, 'REPLACE CHARACTER'.

我的应用程序使用的是jdk 1.6。

我发现当我将应用程序的jdk更改为1.7时,它会正确打印字符。

PlayStation®4专业版

More Information

我的应用程序使用ibatis,问题发生在queryForObject之后。

public class A {
    private String content;
    public String getContent() {
        return content;
    }
}
A a = (A)queryForObject("mapper.getSomething", params);
return a;
// jdk1.6 - a.getContent() : PlayStationufffdufffd4 Pro
// jdk1.7 - a.getContent() : PlayStation®4 Pro

JDBC连接属性是这样的。

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://{IPADDRESS}/{DBNAME}?Unicode=true&characterEncoding=MS949&zeroDateTimeBehavior=convertToNull&socketTimeout=500000&connectTimeout=500000

More Information 2

  • 我测试没有ibatis和其他人。直接使用jdbc连接,但结果相同。
public class CharacterEncodeTest {
    // JDBC driver name and database URL
    static final String DB_URL = "jdbc:mysql://{IPADDRESS}/{DBTNAME}}?Unicode=true&characterEncoding=MS949&zeroDateTimeBehavior=convertToNull&socketTimeout=500000&connectTimeout=500000";

    //  Database credentials
    static final String USER = "{USER}";
    static final String PASS = "{PASSWORD}";

    public static void main(String[] args) {
        Connection conn = null;
        Statement stmt = null;
        try {
            //STEP 2: Register JDBC driver
            Class.forName("com.mysql.jdbc.Driver");

            //STEP 3: Open a connection
            System.out.println("Connecting to a selected database...");
            conn = DriverManager.getConnection(DB_URL, USER, PASS);
            System.out.println("Connected database successfully...");

            //STEP 4: Execute a query
            System.out.println("Creating statement...");
            stmt = conn.createStatement();

            String sql = "SELECT * from TABLE";
            ResultSet rs = stmt.executeQuery(sql);
            //STEP 5: Extract data from result set
            while (rs.next()) {
                //Retrieve by column name
                String content = rs.getString("content");

                //Display values
                System.out.print("content: " + content);
                // jdk1.6 : PlayStationufffdufffd4 Pro
                // jdk1.7 : PlayStation®4 Pro
            }
            rs.close();
        } catch (SQLException se) {
            // something
        } finally {
            // something
        }//end try
    }
}

Question

唯一的区别就是改变jdk版本。

  1. 关于这个问题,jdk 1.6和1.7之间有什么区别?
  2. 在jdk 1.6中有没有解决这个问题的方法?
答案

不知道是什么 ufffd,但®符号是 u00ae:https://www.fileformat.info/info/unicode/char/00ae/index.htm

另一答案

如果为一个特殊字符看到两个替换字符( 或?),则UTF-8二进制数据被转换为双字节序列,每个字节> 127,并且只能知道256个单字节编码中的字符不可转换字符。

因此,String(Unicode)被转换为UTF-8字节,然后这些字节转换为某些单字节编码。

这可以是编码为UTF-8的URL参数,作为ISO-8859-1接收。或者其他一些干涉。 URL。 URL解码/编码有一个encoding参数。最有可能的是环境也发生了变化。如果在java代码中使用®,编辑器必须具有与javac编译器相同的编码,并且能够表示符号(通过使用u00AE来检查)。

搜索默认编码用法:

  • string.getBytes()
  • new String(bytes)
  • URLDecoder.decode(string)
  • URLEncoder.encode(string)
  • FileReader/FileWriter
  • InputStreamReader(inputStream)
  • OutputStreamWriter(outputStream)

zip处理也获得了对文件名的Unicode支持。

反模式:

  • new String(string.getBytes(...), ...)
另一答案

不知道,但我认为jdk 1.6和jdk 1.7对字符使用不同类型的编码。请访问以下链接:

Does Java 1.7 use a different character encoding?

Why is my String returning "ufffdufffdN a m e"

另一答案

你最初有两个问号字符。这看起来有一个UTF8字符,但是你的代码无法读取4字节序列,因此显示了2个问号 - 每个代表一个未知的2字节字符。当您的代码永远无法处理UTF8时,您确定数据没有改变吗?之前可能是这个4字节的字符:https://en.wikipedia.org/wiki/Enclosed_R

以上是关于为什么在java 6和java 7中获得character®(U + 00AE)是不同的?的主要内容,如果未能解决你的问题,请参考以下文章

在 Java 6 和 Java 7 中使用透明窗口

20175213 2018-2019-2 《Java程序设计》第7周学习总结

java 中switch

java二维数组int[][]a=1,2,3,,4,5,6,7,8,9啥意思,

如何在Java 6中使用为Java 7编译的库?

防止 Java 7/8 采样声音在播放时点击(适用于 6)