问题描述
在将字符串转换为字节后,将字符串转换回适当的值时遇到一些问题。
初始字符串:
"0000000000Y Yã"
其中'ã'只是一个字符值。
转换代码:
byte[] b = s.getBytes(StandardCharsets.US_ASCII);
但是,当用于将其转换回去时:
String str = new String(b,StandardCharsets.US_ASCII);
我收到了:
"0000000000Y Y?"
有人知道为什么吗?
谢谢。
解决方法
ã
不是ASCII字符,因此实现方式给出了处理方式
https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#getBytes-java.nio.charset.Charset-
此方法始终使用此字符集的默认替换字节数组替换格式错误的输入和不可映射的字符序列。
对于此字符集,它显示为'?'
, ã
不属于US_ASCII字符集。
getBytes()
方法记录在以下文件中:
此方法始终替换格式错误的输入和不可映射的字符 具有此字符集的默认替换字节数组的序列。
(请参见the documentation)
对于US_ASCII,默认替换字节数组似乎是一个表示'?'的字节。字符(ASCII代码0x3F)。因此,这就是代替您的ã
字符插入字节数组的内容。
转换回String
时,将获得与替换字节相对应的字符,即'?'。字符。
因此,如果您转换为字节,并且想要找回相同的字符,请确保使用包含要使用的每个字符的字符集。一个安全的决定是UTF-8。
如果您需要遵循某些字符编码(例如,因为某些外部接口需要这样做),那么Java的替换策略就可以了,但是当然有些字符会丢失。
,这是因为ã
不是ASCII字符。检查一个
ASCII table获取有效的ASCII字符。