【问题标题】:String to Byte Conversion and Back Again Not Returning Same Result (ASCII)字符串到字节的转换并再次返回不返回相同的结果 (ASCII)
【发布时间】:2020-09-17 10:03:59
【问题描述】:

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

初始字符串:

"0000000000Y        Yã"

“ã”只是一个字符值。

转换代码:

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

但是在使用转换回来时:

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

我收到了:

"0000000000Y        Y?"

有人知道这是为什么吗?

谢谢。

【问题讨论】:

    标签: java arrays string ascii string-conversion


    【解决方案1】:

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

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

    此方法总是用此字符集的默认替换字节数组替换格式错误的输入和不可映射的字符序列。

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

    【讨论】:

      【解决方案2】:

      ã 不是 US_ASCII 字符集的一部分。

      getBytes() 方法记录在:

      此方法总是替换格式错误的输入和不可映射的字符 具有此字符集的默认替换字节数组的序列。

      (见the documentation

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

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

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2011-01-13
          • 2012-02-05
          • 2015-01-19
          • 2013-02-18
          • 2013-08-04
          • 1970-01-01
          • 1970-01-01
          • 2010-11-28
          • 2011-10-30
          相关资源
          最近更新 更多