1
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})); 是周杰伦,另外一个乱码。不知道对你有没有帮助
|
2
springmarker OP @a87150 你是 spring 的 web 环境吗?我的是在这个环境下出现问题的,在 application 中就没问题
|
3
binux 2017-02-18 02:45:05 +08:00 2
任何不显式要求编码的 bytes 转化都要小心。
等你长大了就懂了。 |
4
springmarker OP @binux 我的需求并不是转化,我的情况是在两个环境中发现同一个字符串 getByte()的结果不一样
|
5
binux 2017-02-18 02:53:12 +08:00
@springmarker #4 你 getByes() 就是将 unicode 转 二进制编码啊!
|
6
thekll 2017-02-18 03:27:52 +08:00
检查 web 容器的编码设置。
|
7
EthanZ 2017-02-18 04:19:43 +08:00
try add @RequestMapping(*********,produces = "application/json; charset=utf-8")
|
8
tt7 2017-02-18 05:00:51 +08:00
Java 的 getBytes() 不加参数是用当前 platform 默认 charset 编码, 应该不是你 IDE 设置的文件编码; new String() 同理。 Hakurei 同学已经告诉了你答案…
|
9
ynyounuo 2017-02-18 05:58:35 +08:00
这是一个「锟斤拷」的问题
|
10
zhilincom 2017-02-18 08:06:50 +08:00 via Android
Java 内部默认编码不是 UTF-16 吗?还有.java 文件的存储编码和编译运行时的内部编码是不相关的。
|
11
szq8014 2017-02-18 08:36:51 +08:00 2
vm 参数加上 -Dfile.encoding=UTF-8 试试呢?
|
12
YzSama 2017-02-18 08:45:29 +08:00 via iPhone
试试 jvm 加编码参数。
|
13
luguanyu1234 2017-02-18 08:46:14 +08:00
请用这个重载 String::getBytes(String charsetName)
直接写明需要的编码类型 如果用没有参数的那个 getBytes ,这个 charsetName 是系统默认编码类型, 你可以调用 Charset.defaultCharset().name()看下 两种情况下是不是不一样的 |
14
mgcnrx11 2017-02-18 09:11:42 +08:00 via iPhone
tomcat 在 IDEA 下跑会用系统默认编码,是不是控制台输出都已经乱码了?加 VM 参数-Dfile.encoding=UTF-8 可破
|
15
angelface 2017-02-18 09:34:09 +08:00
我猜, 你用的是 Tomcat?
|
16
guoxu1231 2017-02-18 11:59:46 +08:00 via iPhone
三小时就奔溃了?看来楼主不太适合程序员这个职业啊~
|
17
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"/> |
18
vh2h 2017-02-18 12:08:13 +08:00
这不是你的锅
这应该是周杰伦的锅 |
19
springmarker OP @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 发现用包子的名字也不好使,锅要不要甩给他 |
20
rogerchen 2017-02-18 12:54:23 +08:00 via Android
|
21
szq8014 2017-02-18 12:57:48 +08:00
@springmarker 控制台输出乱码就不是应用程序的事儿了吧,可以再开一个帖子问终端乱码怎么解决?(手动滑稽)
如果是 IDE 集成的那种控制台,可以看看 IDE 相关字符集的设置,也可以直接给 IDE 来个 file.encoding=UTF-8 毕竟都是 java 。 如果是 *nix 的,我也不太了解,确定安装了中文字体? |
22
fantastM 2017-02-18 13:26:26 +08:00
@springmarker 是不是 IDEA 的 Setting->Build,Execution,Deployment->Compiler->Java Compiler 的配置不正常了
|
23
springmarker OP |
24
springmarker OP @fantastM
看着并没有不正常,编译器用 javac 和 eclipse 都不行,要是有问题的话,按理说 application 输出也该是错误的 |
25
mgcnrx11 2017-02-18 13:41:56 +08:00 via iPhone
@springmarker 你确定 ide 设置的 console 是 utf-8 ?我从来没有找到哪里能设置 IDEA 的 console 编码。
控制台编码和不同终端的设置相关,默认跟操作系统的一致 |
26
wohenyingyu02 2017-02-18 13:45:28 +08:00
不可以加 bom 头么
|
27
springmarker OP @mgcnrx11
这个确实没有设置的地方,网上看到的都是加上-Dfile.encoding=UTF-8 这一句,但是加上之后, application 还是正常的,跟之前结果一样。但是 web 下中文都是乱码的,输出的结果却是正常的。 其实我更想知道怎么解决。 |
28
springmarker OP @wohenyingyu02
跟 bom 没关系吧,况且加了 bom 的话,容易出问题吧,之前有 bom 的 java 文件怎么编译都编译不过 |
29
SoloCompany 2017-02-18 18:28:35 +08:00 via iPhone
|
30
raptor 2017-02-18 18:59:28 +08:00 3
第一,这是 windows 的锅, IDEA 启动 tomcat 的时候用的系统编码,所以是 GBK
第二,其实这也不怪 windows ,因为早年工信部要求计算机系统都必须用 GBK ,现在的 windows 为了保持兼容,所以还是 GBK ,英文版 windows 是 unicode 的 第三,现在除了中文 windows 以外,其它系统基本都是 unicode ,所以珍爱生命,远离中文 windows |
31
binux 2017-02-18 19:28:29 +08:00
我一开始就说了「任何不显式要求编码的 bytes 转化都要小心」
你显式指定编码不就完了,你管它环境是什么啊! 就算你要依据环境自动配置,你不会自己读取环境变量,然后手动指定吗? |
32
binbinyouliiii 2017-02-18 19:59:50 +08:00
@binux 一开始我以为你说的意思是 getByte("utf-8")
|
33
binux 2017-02-18 20:03:38 +08:00
@binbinyouliiii #32 我说的就是 getByte("utf-8") 啊。。
|
34
springmarker OP @binux 我当时试了一下,结果输出还是乱码,你这么一说好像我当时输出的姿势不太对,刚才试了一下的确可以,谢谢
|
35
binux 2017-02-18 20:50:41 +08:00
@springmarker #34 你的输出编码,要和展示编码一致啊
|
36
billlee 2017-02-18 21:22:46 +08:00
不要用 new String(byte[]) 接口,以及任何不指定编码就把字节流转换成字符串的接口,不指定编码就对字节流进行解码就是耍流氓
显式地用 new String(byte[], Charset) |