使用变音符号的响应文本的内容长度错误

时间:2014-04-14 09:31:55

标签: java spring http diacritics

与变音符号有关联的问题。 我根据要求获得说明:

@RequestMapping(value = "/description", method = RequestMethod.POST, consumes = "application/json", produces = "text/plain;charset=UTF-8")
    @ResponseBody
    private String getDescription() {        

        return "ärchik";
    }

on frontend response.responseText无法为最后一个字母打分 response.responseText =“ärchi”

我发现内容长度错误的问题:7 如果设置Content-Length:8,那么它将起作用并返回完整描述“ärchik”

但我不明白为什么8?

"ärchik".getBytes("UTF-8").length = 7

响应标题

缓存控制:必重新验证

的Content-Length:7

内容类型:文本/无格式;字符集= UTF-8

日期:星期一,2014年4月14日09:08:26 GMT

服务器:Apache-狼/ 1.1

3 个答案:

答案 0 :(得分:4)

我正在将评论的核心转化为答案,因为我似乎走在正确的轨道上。

字符串比预期长一个字节的最可能原因是'ä'被编码为三个字节而不是两个字节。如果不使用预先组合的代码点U + 00E4(UTF-8:c3 a4)而是使用字母'a'(U + 0061处的简单ASCII字母)后面跟{{{ 3}} diaresis U + 0308,一起编码为61 cc 88。有几个combining,较长的编码通常是转换为NFD的结果。

看看你自己的答案,看起来你只是进行了规范化,其中内容长度已经从非规范化(或者可能是NFC规范化的)字符串中确定。

答案 1 :(得分:1)

这是我的错((我正在设计过滤器

//set content-length = 7    
chain.doFilter(request, wrappedResponse); 
byte[] bytes = wrappedResponse.getByteArray(); 
String out = new String(bytes, utf8Charset);//7bytes 
out = Normalizer.normalize(out , Normalizer.Form.NFD);//8bytes

答案 2 :(得分:0)

spring / tomcat响应是对的。

  response.responseText is Ajax response Object?

我猜:js文件编码不是UTF-8;某些功能不适用于javascript的UTF-8。