【问题标题】:Trademark (™) symbol displayed as ? during marshalling process using JAXB?商标 (™) 符号显示为 ?在使用 JAXB 的编组过程中?
【发布时间】:2014-01-22 22:10:46
【问题描述】:

我有一个需要编组的 Java 对象。我的对象的属性之一有一个包含商标符号 (™) 的字符串描述。

但在编组完成后,它会显示为问号 (?)。我玩过编码并尝试将其设置为 US-ASCII 然后它返回并完美显示符号。

我用谷歌搜索了 ASCII 和 UTF-8 之间的区别,但看起来 UTF 具有更大的字符集 UTF-8 vs ASCII Text

话虽如此,如果 UTF-8 具有更大的字符集,从 UTF-8 转到 ASCII 看起来有点危险。

我也看过这个Usages of ASCII and UTF-8,ASCII 的使用率不到 1%。

使用 JAXB 对 ™ 进行编码的正确方法是什么?

我的编组器对其进行解码如下所示:

public String marshall(final Response response) {
    final Marshaller marshaller = getContextResponse().createMarshaller();
    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.FALSE);
    marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
    final StringWriter writer = new StringWriter();
    synchronized (responseMarshalMutex) {
       marshaller.marshal(response, writer);
    }
    return writer.getBuffer().toString();
}

【问题讨论】:

  • 我相信与您的说法相反的说法是正确的。由于 UTF-8 是 ASCII 的超集,因此从 ASCII 转换为 UTF-8 始终是安全的,因为可以保证不会丢失任何信息。每个字符都将被保留。但是,从 UTF-8 转换为 ASCII 是危险的,因为任何非 ASCII 字符都会被转换为类似'?' 的字符(或者会产生异常,具体取决于您进行转换的方式)。
  • 不知道我的措辞是否正确,但正如我所说的“如果 UTF-8 有更大的字符集,从 UTF-8 转到 ASCII 很危险”。这确实表明 UTF-8 = (ASCI + more)。还是我错过了什么:)

标签: java encoding utf-8 jaxb marshalling


【解决方案1】:

当您告诉 JAXP 使用 ASCII 作为编码时,它将使用字符实体表示任何非 ASCII 字符……例如 (TM) 字符。这将通过一个 7 位通道而不会损坏,并且通常可以使用不适当的字符编码“安全地”解码。

当您告诉 JAXP 使用 UTF-8 作为编码时,非 ASCII 字符将被编码为多字节序列,其中许多都设置了最高位。如果您随后尝试(例如偶然)在某个时候使用错误的编码对其进行解码,您很可能会出现某种乱码。 (例如,如果 XML 是在 HTTP 请求或回复中发送的,而您忽略了在 'content-type' 标头中指定字符编码,则可能会发生这种情况。

如果可以选择,最好在生成 XML 时使用 ASCII(或 Latin-1)作为编码。这将最大限度地提高您在最终解析 XML 时获得相同文本值的机会。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-31
    • 1970-01-01
    • 2014-03-21
    • 1970-01-01
    相关资源
    最近更新 更多