关于java中String.getBytes()问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于java中String.getBytes()问题相关的知识,希望对你有一定的参考价值。

都说是得到一个系统默认的编码格式的字节数组,可是这个字节数组里面存放的数据代表什么。比如
String str = "你";
byte[] bytes = str.getBytes();
for(int i = 0;i < bytes.length;i++)
System.out.println(i+":"+bytes[i]);

输出:
0:-28
1:-67
2:-96
这-28,-67,-96表示的是什么呢?

api中
getBytes():使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。 当此字符串不能使用默认的字符集编码时,此方法的行为没有指定。如果需要对编码过程进行更多控制,则应该使用 CharsetEncoder
类。

http://www.blogjava.net/baizhihui19870626/articles/388054.html这个是对字符集的解释 根据不同的编码格式 得到的数据也不一样
参考技术A 你用的是UTF8的编码吧,一个中文需要三个字节存储的,具体的byte并没有特殊的意思;只不过一个汉字需要24位来标识,你拆分成三个八位的byte,比如00000001。System.out对象会输出一个数字。。

Java:String.getBytes(Charset) 与。 Charset.encode(String) 用于 OutputStream

【中文标题】Java:String.getBytes(Charset) 与。 Charset.encode(String) 用于 OutputStream【英文标题】:Java: String.getBytes(Charset) Vs. Charset.encode(String) for use with OutputStream 【发布时间】:2015-10-05 13:03:54 【问题描述】:

我的算法有两个输入:

1 个将被编码的 utf8 字符串对象 1 个字符集对象,指示我需要将字符串编码成什么

最后,返回的结果会被放入一个OutputStream,这个动作可能会发生多次,但至少会发生一次。在这种情况下不会发生多线程。

我找到了两个解决方案:

    在给定的字符串上调用 getBytes(Charset) 并提供给定的字符集。这将返回一个字节[] 在给定的字符集上调用 encode(String) 并提供给定的字符串。这将返回一个 ByteBuffer。

深入研究这些方法背后的代码显示了每个底层算法的复杂设计。我不能说我明白如何在这两个选项之间做出选择。

    调用这两种方法是否存在显着的性能差异? 将结果放入 OutputStream 是否存在显着的性能差异? 足迹是否存在显着差异?

哪种解决方案通常是更好的选择?

【问题讨论】:

很可能不会,很可能不会,很可能不会,并使用您觉得舒服的任何一个。像这样的微优化是浪费时间。 @Kayaman 我喜欢micro optimization这个词 @nafas 很多人都喜欢这个主意。 @Kayaman 如果您正在开发一个需要微秒级别优化的应用程序,我可以理解。但是对于那些使用 java 来编写此类程序的人,我只是说“祝你好运”:) @nafas 这完全取决于技能。例如,下面的 Lawrey 先生使用 Java 创建了几个性能关键库。 【参考方案1】:

在这两种情况下,都会动态构建 byte[] 来对字符串进行编码。一种更有效的方法是将其直接写入 OutputStream。例如

OutputStreamWriter osw = new OutputStreamWriter(out, StandardCharsets.UTF_8);
// look Mum, no byte[] needed
osw.write(text);

如果您需要二进制格式,也可以使用 DataOutputStream.writeUTF。

【讨论】:

除非,如果您使用非 BMP 字符,DataOutputStream.writeUTF 会写入破坏的输出(“修改的 UTF”)。 @ChrisJester-Young DataOutputStream.writeUTF 只有在您使用 DataInputStream.readUTF esp 时才真正有用,因为它会在开头添加两个字节作为长度。例如,它不会损坏字符。

以上是关于关于java中String.getBytes()问题的主要内容,如果未能解决你的问题,请参考以下文章

java中文乱码,能说下string.getBytes()和new String()转码是,具体点。

java String.getBytes()编码问题——String.getBytes(charset)

Java:String.getBytes(Charset) 与。 Charset.encode(String) 用于 OutputStream

String.getBytes()

java 中string与bytes的转换总结

字符编码问题