要崩溃了,一个编码问题缠了我 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}));
6657 次点击
所在节点    Java
36 条回复
a87150
2017-02-18 02:39:48 +08:00
IDEA utf-8 运行 System.out.println(new String(new byte[]{-27, -111, -88, -26, -99, -80, -28, -68, -90})); 是周杰伦,另外一个乱码。不知道对你有没有帮助
springmarker
2017-02-18 02:44:03 +08:00
@a87150 你是 spring 的 web 环境吗?我的是在这个环境下出现问题的,在 application 中就没问题
binux
2017-02-18 02:45:05 +08:00
任何不显式要求编码的 bytes 转化都要小心。
等你长大了就懂了。
springmarker
2017-02-18 02:51:09 +08:00
@binux 我的需求并不是转化,我的情况是在两个环境中发现同一个字符串 getByte()的结果不一样
binux
2017-02-18 02:53:12 +08:00
@springmarker #4 你 getByes() 就是将 unicode 转 二进制编码啊!
thekll
2017-02-18 03:27:52 +08:00
检查 web 容器的编码设置。
EthanZ
2017-02-18 04:19:43 +08:00
try add @RequestMapping(*********,produces = "application/json; charset=utf-8")
tt7
2017-02-18 05:00:51 +08:00
Java 的 getBytes() 不加参数是用当前 platform 默认 charset 编码, 应该不是你 IDE 设置的文件编码; new String() 同理。 Hakurei 同学已经告诉了你答案…
ynyounuo
2017-02-18 05:58:35 +08:00
这是一个「锟斤拷」的问题
zhilincom
2017-02-18 08:06:50 +08:00
Java 内部默认编码不是 UTF-16 吗?还有.java 文件的存储编码和编译运行时的内部编码是不相关的。
szq8014
2017-02-18 08:36:51 +08:00
vm 参数加上 -Dfile.encoding=UTF-8 试试呢?
YzSama
2017-02-18 08:45:29 +08:00
试试 jvm 加编码参数。
luguanyu1234
2017-02-18 08:46:14 +08:00
请用这个重载 String::getBytes(String charsetName)
直接写明需要的编码类型

如果用没有参数的那个 getBytes ,这个 charsetName 是系统默认编码类型,
你可以调用 Charset.defaultCharset().name()看下 两种情况下是不是不一样的
mgcnrx11
2017-02-18 09:11:42 +08:00
tomcat 在 IDEA 下跑会用系统默认编码,是不是控制台输出都已经乱码了?加 VM 参数-Dfile.encoding=UTF-8 可破
angelface
2017-02-18 09:34:09 +08:00
我猜, 你用的是 Tomcat?
guoxu1231
2017-02-18 11:59:46 +08:00
三小时就奔溃了?看来楼主不太适合程序员这个职业啊~
fantastM
2017-02-18 12:05:34 +08:00
vim /usr/local/tomcat7/conf/server.xml

<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8"/>
vh2h
2017-02-18 12:08:13 +08:00
这不是你的锅

这应该是周杰伦的锅
springmarker
2017-02-18 12:43:29 +08:00
@EthanZ
并不是 url 参数乱码问题,要是这种问题就好解决了

@szq8014 @YzSama
加参数运行结果倒是对了,但是控制台输出中文的全是乱码

@luguanyu1234
在 web 下是 GBK , application 下是 UTF-8 ,这跟之前猜的一样,问题是,怎么让 web 下默认是 utf-8

@mgcnrx11
加参数运行结果是对的,但是控制台中文变成了乱码,不加参数的时候,虽然 web 下默认编码变成了 gbk ,但控制台输出的依然是正常的,反而在 web 下,输出 utf-8 编码的 byte 是乱码,这也是我想让你们帮忙测试一下我最后写的,看是不是个例

@angelface
没错,但是不用猜,内容里写了

@fantastM
URIEncoding ,应该是解决 url 参数乱码的问题,况且就算加了,也没什么用

@guoxu1231
发帖时大晚上的,想睡觉,但是不解决心里不舒服,于是开始暴躁了

@vh2h
发现用包子的名字也不好使,锅要不要甩给他
rogerchen
2017-02-18 12:54:23 +08:00
@springermaker
1.String 的内部表示
2.getBytes 的参数
3.网页模板的 charset

把我觉得锅在 3 上

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

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

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

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

© 2021 V2EX