商标(™)符号显示为?在使用JAXB的编组过程中?

时间:2014-01-22 12:44:30

标签: java encoding utf-8 jaxb marshalling

我有一个需要编组的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();
}

1 个答案:

答案 0 :(得分:2)

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

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

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