要崩溃了,一个编码问题缠了我 3 小时

2017-02-18 02:27:26 +08:00
 springmarker
需要对字符串进行加密,写好了,发现结果跟预期不一样:
字符串已经硬写到 java 文件中了,在 WEB 服务下自动变成 gbk 编码的,在 Application 下就是 utf-8 编码。
比如“周杰伦”这个字符串,
输出 "周杰伦".getBytes();

WEB 下是 -42 -36 -67 -36 -62 -41
Application -27 -111 -88 -26 -99 -80 -28 -68 -90

看 byte 个数基本都能猜出是什么编码了,一转码一看还真是有问题。

我已经把能调成 utf-8 的全调成 utf-8 了,还是不对,真是要崩溃了,要是数据库, springmvc 啥的乱码还好说,这个完全不知道咋回事。
编辑器是 IDEA 2016.3 , spring4.3.6 , tomcat8 ,两个模式下环境一模一样。

java 文件用别的编辑器看也是 utf-8 编码, class 用 IDEA 和 jd-gui 看也是很正常,也没有乱码。

不知到要把锅甩给谁了, Spring ? IDE ?

有环境的兄弟帮忙运行看一下有没有问题,看是不是我的锅
System.out.println(new String(new byte[]{-27, -111, -88, -26, -99, -80, -28, -68, -90}));
System.out.println(new String(new byte[]{-42,-36,-67,-36,-62,-41}));
6594 次点击
所在节点    Java
36 条回复
szq8014
2017-02-18 12:57:48 +08:00
@springmarker 控制台输出乱码就不是应用程序的事儿了吧,可以再开一个帖子问终端乱码怎么解决?(手动滑稽)

如果是 IDE 集成的那种控制台,可以看看 IDE 相关字符集的设置,也可以直接给 IDE 来个 file.encoding=UTF-8 毕竟都是 java 。
如果是 *nix 的,我也不太了解,确定安装了中文字体?
fantastM
2017-02-18 13:26:26 +08:00
@springmarker 是不是 IDEA 的 Setting->Build,Execution,Deployment->Compiler->Java Compiler 的配置不正常了
springmarker
2017-02-18 13:27:18 +08:00
@rogerchen
不是传值的问题,字符串已经硬写在 java 中了。

@szq8014
ide 集成的控制台,设置的都是 utf-8 ,但是在同一环境下,同一个控制台,中文字符串输出都是正常的,但是在 spring 的 web 环境下运行字符串 getByte()却是 gbk 编码,在 test 下直接运行就是 utf-8 编码,很奇怪的问题
springmarker
2017-02-18 13:40:51 +08:00
@fantastM
看着并没有不正常,编译器用 javac 和 eclipse 都不行,要是有问题的话,按理说 application 输出也该是错误的
mgcnrx11
2017-02-18 13:41:56 +08:00
@springmarker 你确定 ide 设置的 console 是 utf-8 ?我从来没有找到哪里能设置 IDEA 的 console 编码。

控制台编码和不同终端的设置相关,默认跟操作系统的一致
wohenyingyu02
2017-02-18 13:45:28 +08:00
不可以加 bom 头么
springmarker
2017-02-18 13:49:59 +08:00
@mgcnrx11
这个确实没有设置的地方,网上看到的都是加上-Dfile.encoding=UTF-8 这一句,但是加上之后, application 还是正常的,跟之前结果一样。但是 web 下中文都是乱码的,输出的结果却是正常的。
其实我更想知道怎么解决。
springmarker
2017-02-18 13:52:46 +08:00
@wohenyingyu02
跟 bom 没关系吧,况且加了 bom 的话,容易出问题吧,之前有 bom 的 java 文件怎么编译都编译不过
SoloCompany
2017-02-18 18:28:35 +08:00
https://youtrack.jetbrains.com/issueMobile/WI-21388

不知道对你有没有帮助,建议你还是先看一下 idea 各个 encodings 设置是怎么生效的吧
raptor
2017-02-18 18:59:28 +08:00
第一,这是 windows 的锅, IDEA 启动 tomcat 的时候用的系统编码,所以是 GBK
第二,其实这也不怪 windows ,因为早年工信部要求计算机系统都必须用 GBK ,现在的 windows 为了保持兼容,所以还是 GBK ,英文版 windows 是 unicode 的
第三,现在除了中文 windows 以外,其它系统基本都是 unicode ,所以珍爱生命,远离中文 windows
binux
2017-02-18 19:28:29 +08:00
我一开始就说了「任何不显式要求编码的 bytes 转化都要小心」

你显式指定编码不就完了,你管它环境是什么啊!
就算你要依据环境自动配置,你不会自己读取环境变量,然后手动指定吗?
binbinyouliiii
2017-02-18 19:59:50 +08:00
@binux 一开始我以为你说的意思是 getByte("utf-8")
binux
2017-02-18 20:03:38 +08:00
@binbinyouliiii #32 我说的就是 getByte("utf-8") 啊。。
springmarker
2017-02-18 20:25:08 +08:00
@binux 我当时试了一下,结果输出还是乱码,你这么一说好像我当时输出的姿势不太对,刚才试了一下的确可以,谢谢
binux
2017-02-18 20:50:41 +08:00
@springmarker #34 你的输出编码,要和展示编码一致啊
billlee
2017-02-18 21:22:46 +08:00
不要用 new String(byte[]) 接口,以及任何不指定编码就把字节流转换成字符串的接口,不指定编码就对字节流进行解码就是耍流氓
显式地用 new String(byte[], Charset)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/341328

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX