Java 使用umlaut的响应文本的内容长度错误

Java 使用umlaut的响应文本的内容长度错误,java,spring,http,diacritics,Java,Spring,Http,Diacritics,有一个与umlaut相关的问题。 我应要求获得描述: @RequestMapping(value = "/description", method = RequestMethod.POST, consumes = "application/json", produces = "text/plain;charset=UTF-8") @ResponseBody private String getDescription() { return "ärc

有一个与umlaut相关的问题。 我应要求获得描述:

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

        return "ärchik";
    }
在前端response.responseText无法为最后一个字母打分 response.responseText=“ärci”

我发现问题在于内容长度错误:7 如果将内容长度设置为8,则它将工作并返回完整描述“ärchik”

但我不明白为什么是8

"ärchik".getBytes("UTF-8").length = 7
响应标题

缓存控制:必须重新验证

内容长度:7

内容类型:文本/纯文本;字符集=utf-8

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


服务器:apachecoyote/1.1

spring/tomcat响应正确

  response.responseText is Ajax response Object?
我猜:js文件编码不是UTF-8;有些函数对javascript的UTF-8不起作用。

这是我的错((我正在解决过滤器)

//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
我把我的评论的核心变成了一个答案,因为我似乎走在了正确的轨道上

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


看看你自己的答案,你似乎只是做了标准化,在一个点上,内容长度已经由非标准化(或者NFC标准化)确定字符串。

您能捕获传输的原始字节吗?我想知道是否在某个点上有转换为NFD的情况,即
ä
表示为三个字节
61 cc 88
(即
'a'
后跟组合diaresis)但是这是一个相当疯狂的猜测,我没有设置一个Spring环境来测试它。这是我的错((我正在计算过滤器
chain.doFilter(request,wrappedResponse);
byte[]bytes=wrappedResponse.getByteArray();
字符串输出=新字符串(bytes,utf8Charset);/7bytes
out=Normalizer.normalize(out,Normalizer.Form.NFD);//8bytes
在规范化字节数为8之后,在此之前设置内容长度