我有一个需要编组的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();
}
答案 0 :(得分:2)
当您告诉JAXP使用ASCII作为编码时,它将表示使用字符实体的任何非ASCII字符...例如(TM)字符。这将通过一个7位通道而不会造成损坏,并且通常可以使用不适当的字符编码进行“安全”解码。
当您告诉JAXP使用UTF-8作为编码时,非ASCII字符将被编码为多字节序列,其中许多都设置了最高位。如果你在某个时候尝试(例如偶然)使用错误的编码解码,你可能会得到某种混乱。 (例如,如果XML是在HTTP请求或回复中发送的,并且您忽略了在'content-type'标头中指定字符编码,则可能会发生这种情况。
根据选择,在生成XML时,最好使用ASCII(或Latin-1)作为编码。这将最大限度地提高在最终解析XML时获得相同文本值的机会。