Jar*_*rdo 5 java string encoding
我需要从包含用户密码的String创建一个哈希.要创建哈希,我使用一个字节数组,我通过调用得到String.getBytes().但是当我在一个不是默认编码的平台上使用指定的编码(例如UTF-8)调用此方法时,非ASCII字符将被默认字符替换(如果我正确理解了getBytes()的行为)因此在这样的平台上,我将得到一个不同的字节数组,并最终得到一个不同的哈希值.
由于字符串内部存储在UTF-16中,因此调用String.getBytes("UTF-16")保证我在每个平台上都获得相同的字节数组,无论其默认编码如何?
是的。不仅保证它是 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")在每个平台上给出相同的结果。
| 归档时间: |
|
| 查看次数: |
3997 次 |
| 最近记录: |