~~~
String srcString = "我们是中国人";
String gbk2UtfString = new String(srcString.getBytes("GBK"), "UTF-8");
System.out.println("GBK转换成UTF-8:" + gbk2UtfString);
String gbk2Utf2GbkString = new String(gbk2UtfString.getBytes("UTF-8"), "GBK");
System.out.println("GBK转换成UTF-8再转成GBK:" + gbk2Utf2GbkString);
~~~
运行结果是:
GBK转换成UTF-8:�������й���
GBK转换成UTF-8再转成GBK:锟斤拷锟斤拷锟斤拷锟叫癸拷锟斤拷。
因为,用GBK编码的中文只能用GBK解码,如果用UTF-8解码就会出现乱码。如果要进行编码转换(GBK--UTF-8),GBK编码的中文先用GBK解码,然后再用UTF-8编码。
*****
分析logstash输出乱码原因:
日志文件的编码是GB2312

filebeat和logstash默认用UTF-8解码,如果用默认配置,中文会如下显示(GBK在filebeat默认用UTF-9解码):

然后在logstash添加输出转码;
codec => plain { charset => "GBK" }
具体配置如下:
```
input {
beats {
port => 5044
codec => plain{ charset => "GB2312" }
}
}
```
中文会如下显示(GBK在filebeat用UTF-9解码,然后在logstash又用GBK解码):

正确的解决办法:
在filebeat添加转码配置encoding:GB2312,配置如下:
```
- type: log
enabled: true
paths:
- F:\log\*
encoding: GB2312
```
中文显示正常:

因为,filebeat用GB2312解码日志文件,然后用UTF-8编码字节流输出到logstash。