String.getBytes() 方法是大端序还是小端序?

8

我需要将字符串发送到客户端套接字,为了正确的顺序,大小端很重要,但是我在源代码中没有看到大小端信息。这个问题需要关注吗?或者我可以跳过这些代码?

1个回答

12

getBytes() 使用系统默认的字符集,这意味着基本上一切都有可能发生。它可以是大端UTF-16、小端UTF-16、UTF-8、ISO-8859-1等等。

如果您需要指定字节序或者其他字符集相关的内容,您应该使用getBytes(Charset)或者getBytes(String)。所有的JRE都支持一些标准字符集,包括UTF-16BE(大端)和UTF-16LE(小端)。


我对于使用UTF-8 String.getBytes(StandardCharsets.UTF_8)是否会决定字节序方式感到困惑。 - LoranceChen
4
UTF-8 不具有字节序。您可以在这里阅读更多信息(https://dev59.com/rG865IYBdhLWcg3wZdtW),但基本上,字节序仅在同时读取多个字节时,在同一个词中才会产生影响。UTF-8 被定义为只是一个字节流,没有多个字节的词;即使需要多个字节的代码点也是用多个 1 字节的单词定义的。因此作为阅读者/编写者,您只需处理“下一个字节,下一个字节,下一个字节”,在这种情况下,字节序并不重要。 - yshavit
@LoranceChen UTF-8 定义了多字节字符编码中字节的顺序。它并不是真正的小端或大端。 - Peter Lawrey
但是为什么会存在utf-16be和utf-16le呢?难道它们的字节序不重要吗? - LoranceChen
@LoranceChen UTF-16并非以单个字节为单位定义,而是以两个字节(=16位)为单位定义。因此,由于您有多字节的单词,字节序很重要。基本上,如果您正在读取UTF-8,则始终会询问“给我下一个1字节单词”,因此计算机不必与您协商哪个字节最重要。但是,如果您正在读取UTF-16,则始终会询问“给我下一个2字节单词”,对于此操作,计算机需要知道底层流中这两个字节中的哪一个最重要。 - yshavit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接