首页 文章

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

提问于
浏览
4

与变音符号有关联的问题 . 我根据要求获得描述:

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

        return "ärchik";
    }

在前端response.responseText无法得分最后一个字母的响应.responseText =“ärchi”

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

但我不明白为什么8?

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

Response Headers

缓存控制:必须-重新验证

内容长度:7

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

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

服务器:Apache-狼/ 1.1

3 回答

  • 4

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

    字符串比预期长一个字节的最可能原因是 'ä' 被编码为三个字节而不是两个字节 . 如果不使用预先组合的代码点U 00E4(UTF-8: c3 a4 ),而是使用字母 'a' (U 0061处的简单ASCII字母),后跟combining diaresis U 0308,一起编码为 61 cc 88 ,就会发生这种情况 . 有几个normal forms for Unicode,较长的编码通常是转换为NFD的结果 .

    看看你自己的答案,你似乎只做了那个规范化,其中内容长度已经从非规范化(或者可能是NFC规范化的)字符串中确定 .

  • 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
    
  • 0

    spring / tomcat的反应是对的 .

    response.responseText is Ajax response Object?
    

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

相关问题