Java 使用umlaut的响应文本的内容长度错误
有一个与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
@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.1spring/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之后,在此之前设置内容长度