在做腾讯平台开发时,获取的玩家昵称有些会带有腾讯的图标,而使用utf8解析时会出现不可见字符(非utf8编码),写入数据库时会报错。
昵称效果(火狐浏览器):
昵称效果(谷歌浏览器):
SystemHanldelr:params:{"name":"此处为玩家昵称,由于直接添保存会异常,所以截图呈现","roleid":6003}
SystemHandler.GameRoleThree.name://此处为玩家昵称,由于直接添保存会异常,所以截图呈现
//SystemHandler.GameRoleThree.name2: 浪子回头//过滤后效果
[WARN ] 2014-03-30 14:39:21 :
com.ibatis.common.jdbc.exception.NestedSQLException:
--- The error occurred while applying a parameter map.
--- Check the updateRole-InlineParameterMap.
--- Check the statement (update failed).
--- Cause: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x91\x91\xE6\xB5...' for column 'name' at row 1
at com.ibatis.sqlmap.engine.mapping.statement.MappedStatement.executeUpdate(MappedStatement.java:107)
at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.update(SqlMapExecutorDelegate.java:457)
at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.update(SqlMapSessionImpl.java:90)
at com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.update(SqlMapClientImpl.java:66)
at com.stang.game.dao.impl.GameRoleDaoImpl.updateGameRole(GameRoleDaoImpl.java:44)
at com.stang.game.cache.ThreadCache.run(ThreadCache.java:242)
Caused by: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x91\x91\xE6\xB5...' for column 'name' at row 1
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3609)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3541)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2002)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2163)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2624)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2127)
at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1362)
at com.ibatis.sqlmap.engine.execution.SqlExecutor.executeUpdate(SqlExecutor.java:80)
at com.ibatis.sqlmap.engine.mapping.statement.MappedStatement.sqlExecuteUpdate(MappedStatement.java:216)
at com.ibatis.sqlmap.engine.mapping.statement.MappedStatement.executeUpdate(MappedStatement.java:94)
... 5 more
可以使用下面代码对字符进行过滤(效果见上面代码)
public static String checkStr(String str){
String s = null;
char[] cc = str.toCharArray();
for(int i = 0; i < cc.length; i++){
boolean b = isValidChar(cc[i]);
if(!b)
cc[i] = ' ';
}
s = String.valueOf(cc);
return s;
}
private static boolean isValidChar(char ch) {
if ((ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'Z')|| (ch >= 'a' && ch <= 'z'))
return true;
if ((ch >= 0x4e00 && ch <= 0x7fff) || (ch >= 0x8000 && ch <= 0x952f))
return true;// 简体中文汉字编码
return false;
}