写的有些乱 不喜欢 勿喷 。有一点可以肯定的是 每一个场景 没一个过程都是实实在在。
场景:
前端 调 java的接口 读写服务器上的配置文件,同时这个文件写入的数据 c的程序也要去读取文件。相当于文件是个数据源,在业务侧起到一个切换场景,工厂模式里面的不同参数的角色。
问题 :
1、java的程序用的是第三方的ini4j的 类库直接对文件进行读写。这个库 默认就是utf8 的编码格式 不管是读还是写都是utf-8的字符编码。这个最一开始只是在xshell 显示有问题 前台展示没有问题,c那边读取时乱码。
2、 改了写入的字符编码 然后 c那边没有问题了,但是前台展示有问题了,同时自己的demo在xshell控制台打印的也是有问题
3、 把读写强制的加入了 字符编码的格式约束,这个过程花了不少时间,因为最一开始不知道是什么原因。现场c的程序一会读的是乱码,一会不是乱码很烦。用了那个iconf 命令转化也是不行。
4、 就是把所有的都对齐了 就是前端 java接口 文件编码 服务器编码 c端的编码 最后发现 用cat 和vim 打开是时候两个又是乱码, 还有就是 后面写入的会导致前面的内容是乱码。控制台打印的 时而乱码时而不乱码。把服务器上的文件导下来看也是乱码的。你改过流的编码过后,之前在本地调试的部分瞬间又跑不通了,很是诡异, 瞬间就爆炸了。
问题解决的过程:
服务器上
创建一个空文件
用 file 文件名 命令看是 没有编码的 说明:文件的编码主要是针对你输入的流的编码
用 服务器上的编辑工具 cat vim 进行编辑 后
你会发现 不带中文的文件就是 ASCII 编码
带中文的文件就是 ISO8859-1
你在服务器上看文件编码大部分都是 ASCII ISO8859-1 尤其是etc下面的配置文件
本地(window)创建文件 然后传到服务器上(linux)
本地创建一个用记事本打开的 一个没用中文传到 服务器上 然后用 file 查看 是 ASCII编码 带中文的就是 ISO8859-1
本地穿件一个用字符编码 uft8 的那么传到服务器不管中英文都还是utf8 这个为什么utf8 作为网络通信常用的原因虽然占的资源多。
即 除了utf8 服务器和 本地保持一致,其余带中文的服务器上就是ISO8859-1 不带中文的就是 ASCII
===================================下面就是调试测试的============================================
控制读取的字符编码
InputStreamReader isr = new InputStreamReader(new FileInputStream(filePath), "GBK");
Wini ini = new Wini(isr);
控制写入的字符编码
OutputStreamWriter oStreamWriter = new OutputStreamWriter(new FileOutputStream(new File(filePath)), "GBK");
ini.store(oStreamWriter);
其它的业务代码就没有贴了 总要是说明一下Inij4j也可以具体的切换不同的字符编码。 (默认的是utf8)尤其是在服务器的时候是其它编码的时候你用其它的去写 这样文件就变成是utf8的格式。 这样很容易出问题。
还有一个问题就是当你的文件原本是utf8 的格式 用utf8 的操作没有问题 ,然后在原来文件的基础上用GBK或者其它的字符集的时候你会发现 上次写入的utf8的东西是乱码。这样就要求你文件是什么格式 那你至始至终就得用什么格式编码,主要是中文他烦,英文貌似不会遇到这样的问题。
就是在测试的过程你会发现你文件的,又会各种乱码。这里主要就是 xshell 文件编码 还有就linux环境变量设置和控制的。
就是说 你服务器文件是iso8859-1 那么你用的xshell终端必须是gbk 系列的编码 看差不会保证不会乱码。如果你文件是iso8859-1 那你xshell终端用utf-8 你不管用 cat 还是vim 都会是乱码的。还有就是你的流输出的是什么编码 必须和环境编码的 LANG d对应起来 有些人说要改 /etc/systemconf/i18n 文件 最近几天貌似和这个对应不起来 就是说 LANG 设置的是zh_un.GK2312
/etc/systemcon/i18n 设置的对应的是 utf8 的格式 如果你的流是ut8 格式输出的东西在xshell控制台是乱码的。也就是说LANG 是对控制台起决定性作用的。
还有就是上面提到的 对同一个文件 第一次是utf8 第二次 gbk 这样有可能导致之前的uft8 格式写入的东西是乱码,这个时候你不管是用gbk 输出还是utf8 输出 LANG 不管怎么设置也都是乱码, 同时你在 shell改变中段的 字符也是乱码的。也是我就是乱码的 和展示 打印没有关系 换个编码 我只是将这个乱码变成下一个乱码。
参考资料:
解决中文乱码的问题
https://jingyan.baidu.com/article/ab69b270de8b4f2ca7189f1d.html
解决vim 和用cat 显示乱码的问题。
https://blog.csdn.net/onepiecehuiyu/article/details/75208743
编解码:
https://blog.csdn.net/zhblanlan/article/details/81458943
ini4j 编码问题
https://blog.csdn.net/cp1153750171/article/details/81432939
注: 参考链接里面的东西 和我验证的对应不起来 因此和我写的有些出入,实际还是根据大家验证的为准, 实际才是检验真理的唯一标准。