现象
有一台生产机器Ansj分词词库没有生效,jar 包一模一样,并且日志也已经将字典加载了
排查
- 先确定是否 jar 包有问题,拷贝一模一样的包,size 也一模一样,问题还是存在
- jdk 版本有差异,安装一模一样的 jdk 版本,问题还是存在
export -p
查看不同机器的环境变量差异,发现分词出问题的机器 LANG=“C”,分词正常机器LANG=“en_US.UTF-8”,于是export LANG="en_US.UTF-8"
再来重启程序,发现分词正常了,确定就是环境变量导致- 查看/etc/profile和/etc/profile.d/lang.sh 判断 LANG 是设置在
/etc/locale.conf
中,修改好变量以后source /etc/profile
环境变量永久生效
原因分析
网上查到 LANG=C是最早最简单的C语言环境(标准ASCII码)
java的字符串有两个地方会受到字符影响getBytes(charset)和new String(charset),我们做一个测试,测试程序ByteTest.java如下
import java.nio.charset.Charset;
public class ByteTest {
public static void main(String[] args) {
System.out.println(Charset.defaultCharset());
for (byte aByte : "你好".getBytes()) {
System.out.println(aByte);
}
}
}
测试结果
$ javac ByteTest.java
$ export LANG=C
$ java ByteTest
US-ASCII
63
63
$ export LANG=en_US.UTF-8
$ java ByteTest
-28
-67
-96
-27
-91
-67
其他的坑
Ansj有时候分词发现在不同的语序下词库有时候生效有时候不生效,关闭姓名识别功能就正常了new DicAnalysis().setForests(forests).setIsNameRecognition(false).parseStr(text)