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

问题描述 投票:0回答:4

这是我第一次在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() : PlayStation\ufffd\ufffd4 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 : PlayStation\ufffd\ufffd4 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中有没有解决这个问题的方法?
java unicode encoding jdk1.6 jdk1.7
4个回答
1
投票

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


1
投票

如果为一个特殊字符看到两个替换字符( 或?),则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(...), ...)

0
投票

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

Does Java 1.7 use a different character encoding?

Why is my String returning "\ufffd\ufffdN a m e"


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.