String.getBytes("UTF-16")会在所有平台上返回相同的结果吗?

Jar*_*rdo 5 java string encoding

我需要从包含用户密码的String创建一个哈希.要创建哈希,我使用一个字节数组,我通过调用得到String.getBytes().但是当我在一个不是默认编码的平台上使用指定的编码(例如UTF-8)调用此方法时,非ASCII字符将被默认字符替换(如果我正确理解了getBytes()的行为)因此在这样的平台上,我将得到一个不同的字节数组,并最终得到一个不同的哈希值.

由于字符串内部存储在UTF-16中,因此调用String.getBytes("UTF-16")保证我在每个平台上都获得相同的字节数组,无论其默认编码如何?

Jon*_*eet 4

是的。不仅保证它是 UTF-16,而且还定义了字节顺序

解码时,UTF-16 字符集解释输入流开头的字节顺序标记来指示流的字节顺序,但如果没有字节顺序标记,则默认为 big-endian;编码时采用big-endian字节顺序,并写入big-endian字节顺序标记。

(当调用者不要求时,BOM 不相关,因此String.getBytes(...)不会包含它。)

只要您具有相同的字符串内容(即相同的char值序列),那么您将在 Java 的每个实现上获得相同的字节,除非出现错误。(考虑到 UTF-16 可能是 Java 中实现的最简单的编码,任何此类错误都会非常令人惊讶......)

char然而,UTF-16 是(通常是)的本机表示这一事实String仅与易于实现相关。例如,我希望String.getBytes("UTF-8")在每个平台上给出相同的结果。