Java 字符集判断

Java 字符集判断

线上项目中有小票打印设备

小票打印的设备 没有做编码判断 小票机 只能打印GB2312的字符

java后台给出的字符又是UTF-8的 部分字符超过GB2312的范围了

百度了半天 关于Java的字符串 编码判断转换 都不能实现我所需要的效果

其实就是 判断 一下 字符是否超过 GB2312 超过就替换为 “□” 这样的方块

防止小票机出错就行了

但是 百度到的都是 编码转换

比如

String iso8859 = new String(sb.toString().getBytes(“iso8859-1”));
String gbk = new String(sb.toString().getBytes(“gbk”));
String utf8 = new String(sb.toString().getBytes(“utf-8”));
if(iso8859.equals(sb.toString())){
System.out.println(“iso8859”);
}else if(gbk.equals(sb.toString())){
System.out.println(“gbk”);
}else if(utf8.equals(sb.toString())){
System.out.println(“utf8”);
}

或者

return new String(str.getBytes(“ISO-8859-1”), “UTF-8”);

都无法准确的判断 或者转换字符串的编码

实际上得使用

Charset.canEncode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public final static String toGB2312(final String s) {
StringBuffer sb = new StringBuffer();
Charset cs = Charset.forName("GB2312");
CharsetEncoder encode = cs.newEncoder();
for (int i = 0; i < s.length(); i++) {
char x = s.charAt(i);
if (encode.canEncode(x)) {
sb.append(x);
} else {
sb.append("□");
}
}
return sb.toString();
}

问题解决~

优化

GB2312 的字符太小了

很多商品其实是繁体字 是有对应的简体字的 虽然不多 但也聊胜于无吧

引入 https://github.com/program-in-chinese/zhconverter

其中的 “繁到简单字.properties” 改名为 “toSimple.properties”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private final static ResourceBundle keyMap = ResourceBundle.getBundle("toSimple");

public final static String toChineseSimplified(final String str) {
StringBuilder sb = new StringBuilder();

if (str.length() > 1 && keyMap.containsKey(str)) {
return keyMap.getString(str);
}
for (char c : str.toCharArray()) {
String ch = String.valueOf(c);

// 如有多个对应字符, 暂时用第一个; 如果没有对应字符, 保留原字符
sb.append(keyMap.containsKey(ch) ? keyMap.getString(ch).charAt(0) : ch);
}
return sb.toString();
}

在返回给小票机的接口上添加

1
2
3
4
5
6
7
8
try {
//尝试让更多的字符能被扫码机识别
str = EnCodingUtils.toChineseSimplified(str);
//扫码机只能识别 gb2312 不能识别 gb2312 以外的字符 超过范围的用 □ 代替
str = EnCodingUtils.toGB2312(str);
}catch (Exception e) {
log.error("字符转换异常", e);
}

搞定收工~

源码