【问题标题】:Convert UTF-8 encoded string to human readable string将 UTF-8 编码的字符串转换为人类可读的字符串
【发布时间】:2013-02-22 08:09:58
【问题描述】:

如何将任何 UTF8 字符串转换为可读字符串。

Like : â¬(在 UTF8 中)是 €

我尝试使用 Charset 但不工作。

【问题讨论】:

  • 你想要达到什么目的?字符串来自哪里?
  • 我只想将不可读的 UTF8 格式的字符串转换为可读取的字符串(ASCII 或其他可读字符集)。
  • 我从其他问题中得到了这些类型的字符串'
  • 这不是“UTF-8”,而是完全损坏且无法修复的数据。字符串没有编码。
  • 您不能将“⬔转换为“€”。不过,您可以将“âBPH¬”转换为“€”......但只要您一开始不进行这样的编码错误,您就不需要这样做。

标签: java utf-8 character-encoding ascii decode


【解决方案1】:

您使用byte[] b = "Üü?öäABC".getBytes("ISO-8859-15"); 将字符串编码为ISO-8859-15,然后使用UTF-8 System.out.println(new String(b, "UTF-8")); 对其进行解码。您必须以与 ISO-8859-15 相同的方式对其进行解码。

【讨论】:

  • 我也在用 ISO-8859-15 解码。
  • 嗯,是的,行之有效的做法是正确的System.out.println(new String(b, "ISO-8859-15"));。它使用 ISO-8859-15 解码器解码 ISO-8859-15 编码字符串。另一行使用 UTF-8 解码 ISO-8859-15 编码字符串。当然不行。
  • 将某些东西编码为 x,然后再解码为 x 是完全没有意义的。它不会做任何事情,在最好的情况下它会丢失更多信息。
  • 我只是在解释问题中的代码,但问题已被修改。您的评论和反对票没有任何意义。
  • 他在旧代码中所做的是完全合法的尝试修复数据的方式。您在答案中建议的是没有任何意义的 NO-OP。就这样我没有误解 - 您建议将字符串编码为 ISO-8859-15,然后将生成的字节解码为 ISO-8859-15。不用多想就知道这不会做任何事情。
【解决方案2】:

这不是“UTF-8”,而是完全损坏且无法修复的数据。字符串没有编码。在这种情况下说“UTF-8”字符串是没有意义的。 String 是一串抽象字符 - 它没有任何编码,除了作为与我们无关且与您的问题无关的内部实现细节之外。

【讨论】:

  • 这不是真的。字符串总是有一个编码。即使在内存中,逻辑字符也必须进行物理编码。 Java 字符串在内存中使用 UTF-16。如果您有一个包含 UTF-16 编码的 UTF-8 八位字节的字符串,那么您可以将字符值原样复制到 Byte 数组,然后使用 String 构造函数将它们解码回正常的 UTF-16 编码字符串字节数组和编码作为输入。
  • @RemyLebeau 我猜你只看了我回答的第一句话。除了处理星体层时,内部编码永远无关紧要——在这种情况下,UTF-16 的选择会泄露给用户。存储二进制数据(例如编码文本)的数据类型是byte[],而不是String。
【解决方案3】:

java 中的字符串已经是 unicode 表示。当您在其上调用 getBytes 方法之一时,您将获得特定编码中的编码表示(作为字节,因此是二进制值) - 在您的示例中为 ISO-8859-15。如果您想将此字节数组转换回 unicode 字符串,您可以使用接受字节数组的字符串构造函数之一来执行此操作,就像您所做的那样,但您必须使用 exact same encoding字节数组最初是用生成的。只有这样,您才能将其转换回 unicode 字符串(没有编码,也不需要编码)。

请注意无编码方法,包括字符串构造函数和 getBytes 方法,因为它们使用运行代码的平台的默认编码,这可能不是您想要实现的。

【讨论】:

    【解决方案4】:

    您正在尝试以“UTF-8”格式对使用“ISO-8859-15”编码的 byteArray 进行解码

            b = "Üü?öäABC".getBytes("ISO-8859-15");
            u = "Üü?öäABC".getBytes("UTF-8");
    
        System.out.println(new String(b, "ISO-8859-15")); // will be ok
        System.out.println(new String(b, "UTF-8")); // will look garbled
        System.out.println(new String(u,"UTF-8")); // will be ok
    

    【讨论】:

    • 如何启用 UTF-8 控制台?
    • 在 Eclipse -> RunAs->Runconfiguration->commons->Encoding
    • 将某些东西编码为 x,然后再解码为 x 是完全没有意义的。它不会做任何事情,在最好的情况下它会丢失更多信息。
    • 问题已更新@Esailija,此代码与先前发布的示例有关。如果帖子这样结束,我会删除它
    【解决方案5】:

    我认为这里的问题是您假设 java String 是使用您在构造函数中指定的任何内容进行编码的。 不是。是 UTF-16 格式。

    所以,"Üü?öäABC".getBytes("ISO-8859-15") 实际上是将 UTF-16 字符串转换为 ISO-8859-15,然后获取其字节表示。

    如果您想在 Eclipse 控制台中获得人类可读的格式,只需保持原样(在 UTF-16 中) - 并调用 System.out.println("Üü?öäABC"),因为您的 Eclipse 控制台将解码字符串并将其显示为 UTF -16.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-16
      • 2016-10-01
      • 2011-12-08
      • 2011-05-20
      • 2019-11-12
      • 2016-05-16
      • 1970-01-01
      相关资源
      最近更新 更多