【问题标题】:UTF8 encoding issue?UTF8 编码问题?
【发布时间】:2025-11-26 13:15:02
【问题描述】:

我正在调用一个错误的服务,告诉我以下字符串存在编码问题:

通用®

据我了解,此字符串是“utf8”编码的。这是对utf8编码的正确理解吗?如果是这样,这是否表明我应该删除 utf8 编码?如果是这样,有关如何在 Java 中对 utf8 字符串进行解码的任何建议?

还是我错了,上面的String不是utf8编码的?如果是这样,有什么建议如何编码吗?

【问题讨论】:

  • “一个编码问题”——你能说得更具体些吗?是没有正确显示,还是给你一个特定的错误?
  • 对不起,这是我的问题的一部分,我收到的错误正是那么模糊。它说“编码问题”。这就是为什么我想知道这是否暗示我不应该使用 utf8 编码,或者我不应该使用 utf8 编码。
  • “调用服务” - 如何?肥皂? java方法调用?
  • 在 Java String 对象的上下文中,String 在内部以 UTF-8 编码。它以 UTF-16 编码。不过,这在很大程度上是无关紧要的:问题在于您如何将字符串数据传输到您尝试调用的服务,以及该服务希望您如何这样做。显然这些是不匹配的。
  • 查看字符串的渲染输出并不能说明任何事情。这是有意义的底层二进制值。 Joel on Software's The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

标签: java utf-8


【解决方案1】:

Java 存储字符串的方式与消息中的编码方式不同。您可以尝试以下方法:

String s = "Universal®";
byte[] encoded = s.getBytes(Charset.forName("UTF-8"));

您必须使用 UnsupportedCharsetException,但 UTF-8 是标准的可用字符集。

或者您可能需要在发送 API 中设置编码,例如在 HTTP Content-Type: text/plain; charset=UTF-8 中。

【讨论】:

  • 对于 Java 7+,您可以使用 StandardCharsets.UTF_8 代替 Charset.forName("UTF-8")
  • @Andreas Sweet!我没有抓住那个变化。现在,我不必为无用的样板 try/catch 获取 UTF-8 字符集而烦恼。 :)
【解决方案2】:

带有® U+00AE 的“Universal®”不能用纯 7 位 ASCII 表示,尽管它可以用其他几种字符集/编码表示。通用 Unicode 编码UTF-8 可以混合任何文字。

您需要在某些编码中将文本转换为字节,以便能够说明其编码。

在java中String内部是Unicode,可以处理一切。

由于 java 源编码是免费的,但它必须与 java 编译器 javac 使用的编码相同。但是,您可以使用 u 转义,使用 ASCII 来表示特殊符号(在 UTF-16 范围内):

String s = "Universal\u00AE";
byte[] bytes = s.getBytes(StandardCharsets.UTF_8);
String t = new String(bytes, StandardCharsets.UTF_8);
assert t.equals(s);

【讨论】:

    【解决方案3】:

    在非常一般的意义上,编码只是位的分类和分配,用于表示字符串。有关更多详细信息,请参阅下面的链接。通常,所有编码类型都可以相互转移,但也有一些例外。您可能已经看到标记无法显示的符号的大空白方块/等。这通常是由编码错误(例如该编码方案不存在的字符)引起的。

    https://en.wikipedia.org/wiki/UTF-8

    根据您的具体问题,列出的字符串应该是 UTF-8 可编码的。它可能已保存为另一种编码类型(这可能会导致您的问题)。您可以随时尝试将其转换为 UTF-8,然后看看会发生什么。

    编辑 - 关于 cmets,我认为问题与尝试通过服务(或服务)传输之前未正确编码有关。

    【讨论】:

    • 你说的都是真的,但这似乎并不能很好地回答这个问题。
    【解决方案4】:

    在这里快速浏览一下:http://www.utf8-chartable.de/(我们应该知道,不用看,人们)表明@确实是一个 utf8 字符。所以,不知道是什么框架抱怨它不是这样的,但这是错误的

    【讨论】:

    • 那个@应该是®,但是它仍然适用于UTF-8(我认为是注册符号)
    • UTF-8 是一种编码。是的,它可以对字符 ® 进行编码,但这与编码该字符的特定字节序列是否实际上使用 UTF-8 无关,而不是几种替代方法中的任何一种。