为什么在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版本。
- 关于这个问题,jdk 1.6和1.7之间有什么区别?
- 在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)是不同的?的主要内容,如果未能解决你的问题,请参考以下文章
20175213 2018-2019-2 《Java程序设计》第7周学习总结