字符串到字节的转换并再次返回不返回相同的结果 (ASCII)

String to Byte Conversion and Back Again Not Returning Same Result (ASCII)

我在将字符串转换为字节后将其转换回适当的值时遇到一些问题。

初始字符串:

"0000000000Y        Yã"

其中“ã”只是一个字符值。

转换代码:

byte[] b = s.getBytes(StandardCharsets.US_ASCII);

然而当使用转换回来时:

String str = new String(b, StandardCharsets.US_ASCII);

我收到:

"0000000000Y        Y?"

有人知道这是为什么吗?

谢谢。

这是因为ã不是ASCII字符。检查一个 ASCII table 对于有效的 ASCII 字符。

ã不是ASCII字符,所以如何处理由实现给出

https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#getBytes-java.nio.charset.Charset-

This method always replaces malformed-input and unmappable-character sequences with this charset's default replacement byte array.

对于这个字符集,它显示为“?”

ã 不属于 US_ASCII 字符集。

getBytes() 方法记录在案:

This method always replaces malformed-input and unmappable-character sequences with this charset's default replacement byte array.

(参见 the documentation

对于US_ASCII,默认的替换字节数组似乎是一个字节代表'?'字符(ASCII 代码 0x3F)。所以这就是插入到字节数组中代替 ã 字符的内容。

当转换回 String 时,您会得到与替换字节对应的字符,即 '?'字符.

因此,如果您转换为字节,并且想要返回相同的字符,请务必使用包含您打算使用的每个字符的字符集。一个安全的决定是 UTF-8。

如果你需要遵守一些字符编码(例如因为一些外部接口需要那个),那么Java的替换策略是有意义的,但当然有些字符会丢失。