0

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

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

PlayStation\ufffd\ufffd4 Pro

它必须是这样的:

PlayStation®4 Pro

我认为'\ufffd' 字符代表这个,'REPLACE CHARACTER'。

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

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

PlayStation®4 Pro

更多信息

我的应用程序使用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

更多信息 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
    }
}

问题

唯一的区别只是更改 jdk 版本

  1. 关于这个问题,jdk 1.6 和 1.7 有什么区别?

  2. jdk 1.6有解决这个问题的办法吗?

4

4 回答 4

1

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

于 2019-01-29T11:40:26.600 回答
1

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

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

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

搜索默认编码用法:

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

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

反模式:

  • new String(string.getBytes(...), ...)
于 2019-01-29T12:22:58.353 回答
0

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

Java 1.7 是否使用不同的字符编码?

为什么我的字符串返回“\ufffd\ufffdN am e”

于 2019-01-29T11:43:45.927 回答
0

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

于 2019-01-29T12:24:25.120 回答