字符串到字节的转换并再次返回不返回相同的结果 (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的替换策略是有意义的,但当然有些字符会丢失。
我在将字符串转换为字节后将其转换回适当的值时遇到一些问题。
初始字符串:
"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的替换策略是有意义的,但当然有些字符会丢失。