【发布时间】:2019-03-17 16:48:28
【问题描述】:
对不起,如果这是一个愚蠢的问题,我可能在这里遗漏了一些基本的东西。
我只是想使用 UTF-8 对字符串进行编码。遵循最佳实践,我不假设默认字符集是 UTF-8,因此我使用:
"Ñ".getBytes(Charset.forName("UTF-8"))
根据official Unicode spec,这应该是:0xc391
但是,我得到的是:0xc383e28098。
我无法理解这一点。无论我是否设置-Dfile.encoding=UTF-8,都会发生这种情况。
奇怪的是,当我不指定字符集(或使用Charset.defaultCharset())时,使用windows-1252编码,输出正确编码为UTF-8!
更重要的是,当我通过 IntelliJ 而不是命令行运行代码时,UTF-8 字符集实际上可以按预期工作。 IntelliJ 在类路径中添加了很多不相关的库,所以我猜其中一个负责更正,但我希望它能够在生产中工作。
我的java -version:
java version "1.8.0_201"
Java(TM) SE Runtime Environment (build 1.8.0_201-b09)
Java HotSpot(TM) Client VM (build 25.201-b09, mixed mode
【问题讨论】:
-
从
byte[]数组到0xc383e28098十六进制值(进一步的Java 代码、文件、十六进制编辑器...),您究竟做了什么? Java中的字节数组有多长? -
@CarlosHeuberger 为什么重要?我使用字符串文字,不必关心 Java 在内部使用什么编码,它应该正确编码代码点。我还尝试将字符串文字输入为 UTF-8 字节数组,对其进行解码和重新编码,并获得完全相同的结果。无论如何我都会尝试 javac,但我不明白它为什么会有所帮助......
-
@RalfKleberhoff 我只是将字节保存到一个文件中,然后使用十六进制编辑器打开它,使用
java.nio.file.Files.write(Path, byte[]) -
@CarlosHeuberger 实际上,
"Ñ"将写作"\u00d1"。 ("\uc391"是 Hangul syllable。) -
@CarlosHeuberger
"\uc391".getBytes("UTF-8")不会产生该输出。
标签: java unicode utf-8 character-encoding