java 中客户端传来的参数很多都是ISO-8859-1 的编码,我们如果要使用需要将其转换为UTF-8 的编码。
方式如下:
new String(source.getBytes("ISO-8859-1"), "UTF-8")
这样就转换为UTF-8 的编码了。
在实际使用中,有些框架会根据客户端指定编码格式来自动转换,如果我们再次调用转换那么得到的将是乱码。
那么就需要想个办法判断指定字符串是否已经为UTF-8 了。经过多次尝试和搜索引擎查找都没有找到合适的方法能直接判断一个字符串的当前编码格式是什么。
最后发现了一个关系
utf8 的编码格式当iso-8859-1 转换为utf-8后得到的新字符串的长度等于原字符串长度
iso-8859-1的编码格式转换为utf-8 后得到的新字符串的长度不等于原字符串长度
原因是不同编码格式存储字节方式不一样
ISO-8859-1 是单字节编码
UTF-8 对单字节范围内字符仍然用一个字节表示,对汉字采用三个字节表示
详细说明可以参考:https://www.ibm.com/developerworks/cn/java/j-lo-chinesecoding/index.html
最终代码如下:
public static String autoToUtf8(String str) {
if (null == str) {
return null;
}
String newStr = new String(str.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
if (str.length() == newStr.length())
return str;
return newStr;
}
此方法不知道兼容怎么样,目前只是初步想法尝试。如果大家有什么新的发现欢迎随时留言