字符串不包含实体,但显示它,并且表示在替换时不会更改

时间:2014-12-23 20:07:27

标签: java unicode encoding character-encoding unicode-escapes

所以我认为下面的图片很好地展示了我的问题:

enter image description here

我希望原始字符串按原样打印,因为当我在响应中发送它时(使用JAX-RS)它实际上显示的是\ u2018,而不是它应该的左引号。但是,将方法EncodingUtils.clean(...)(它只是Apache Commons Lang StringEscapeUtils.unescapeJava(...)的包装器)应用于发送给响应的字符串并不会改变响应(它仍然是显示\ u2018)。从测试开始他们已经改变了,我在这里缺少什么以及我需要做些什么才能获得预期的替代品?

EDIT1:客户端是一个Android应用程序,麻烦的字符串是前面提到的JSON响应的属性之一。如果我不碰它,手机会显示这个奇怪的角色'€TM。如果我使用Windows-1252对其进行解码,则会向右打印字符,但它会将字符串的其他部分固定。

EDIT2:我有@Produces(text / json)。这些是报告的标题(注意我使用OkHttp进行请求处理):

Date: Tue, 23 Dec 2014 21:05:49 GMT
Connection: close
Server: Jetty(7.5.3.v20111011)
Via: 1.1 vegur
OkHttp-Selected-Protocol: http/1.1
OkHttp-Sent-Millis: 1419368765324
OkHttp-Received-Millis: 1419368765736

此外,从Android打印到控制台接收到的字符串实际打印正确。我不知道发生了什么。

2 个答案:

答案 0 :(得分:1)

我没有看到任何奇怪的行为。

Java已经unescapes字符串文字中出现的转义代码,因此testObj包含Unicode字符0x2018和0x2019,而不是文字字符串" \ u2018"和" \ u2019"。因此,StringEscapeUtils.unescapeJava(...)返回相同的字符串。这意味着testObj.contentEqual(postTreatmentTestObj)为真,因此assertFalse(...)测试失败。

答案 1 :(得分:0)

所以,经过几个小时的愚蠢地伸展我的头脑后,我知道发生的事情基本上是这样的(请参阅2013年4月15日的评论,截至2014年12月23日的工作解决方案):https://code.google.com/p/android/issues/detail?id=3552

有时Google,有时......