我一直在用 Java8、Java 11 中的 String 进行一些编码,但这个问题是基于 Java 8 的。我有这个小片段。
final char e = (char)200;//È
我只是认为 0.255[Ascii+extended Ascii] 之间的字符总是适合一个字节,只是因为 2^8=256 但这似乎不是真的我在网站上尝试过https://mothereff.in/byte-计数器并声明该字符占用 2 个字节,有人可以向我解释一下。
许多帖子中的另一个问题指出 Java 是 UTF-16,但在我运行 Windows 7 的机器上,在此代码段中返回 UTF-8。
String csn = Charset.defaultCharset().name();
这个平台依赖吗?
其他问题我试过这个片段。
final List<Charset>charsets = Arrays.asList(StandardCharsets.ISO_8859_1,StandardCharsets.US_ASCII,StandardCharsets.UTF_16,StandardCharsets.UTF_8);
charsets.forEach(a->print(a,"È"));
System.out.println("getBytes");
System.out.println(Arrays.toString("È".getBytes()));
charsets.forEach(a->System.out.println(a+" "+Arrays.toString(sb.toString().getBytes(a))));
private void print(final Charset set,final CharSequence sb){
byte[] array = new byte[4];
set.newEncoder()
.encode(CharBuffer.wrap(sb), ByteBuffer.wrap(array), true);
final String buildedString = new String(array,set);
System.out.println(set+" "+Arrays.toString(array)+" "+buildedString+"<<>>"+buildedString.length());
}
和版画
run:
ISO-8859-1 [-56, 0, 0, 0] È//PERFECT USING 1 BYTE WHICH IS -56
US-ASCII [0, 0, 0, 0] //DONT GET IT SEE THIS ITEM FOR LATER
UTF-16 [-2, -1, 0, -56] È<<>>1 //WHAT IS -2,-1 BYTE USED FOR? I HAVE TRY WITH OTHER EXAMPLES AND THEY ALWAYS APPEAR AM I LOSING TWO BYTES HERE??
UTF-8 [-61, -120, 0, 0] 2 È //SEEMS TO MY CHARACTER NEEDS TWO BYTES?? I THOUGHT THAT CODE=200 WOULD REQUIRE ONLY ONE
getBytes
我试过
System.out.println(new String(new byte[]{-1,-2},"UTF-16"));//SIMPLE "" I AM WASTING THIS 2 BYTES??
在简历中。
为什么 UTF-16 总是有两个前导字节被浪费了?新字节[]{-1,-2}
为什么当我对“È”进行编码时,我在 ASCCI 字符集中没有得到任何字节,但是当我执行 È.getBytes(StandardCharsets.US_ASCII) 时却得到 {63}?
Java 使用 UTF-16 但在我的情况下 UTF-8 取决于平台?
对不起,如果这篇文章令人困惑
环境
Windows 7 64 Bits Netbeans 8.2 with Java 1.8.0_121
当年话下
料青山看我应如是
相关分类