Java 为什么字符串返回为“quot;4-5 u043Bu0435u0442 103-112 u0441u043C;?

Java 为什么字符串返回为“quot;4-5 u043Bu0435u0442 103-112 u0441u043C;?,java,json,spring,character-encoding,Java,Json,Spring,Character Encoding,我正在开发从不同来源(RESTAPI)收集数据并返回汇总数据的后端 所以我从一个API请求数据。来自该API的响应(所有西里尔字符看起来都不错)描述为@Data class ProductSku{private string label;private boolean isInStock;}: [ { //…忽略许多未使用的字段 “标签”:“1ГББ73-75СМ”, “isInStock”:正确 }, { //…忽略许多未使用的字段 “标签”:“2ГБа82-88СМ”, “isInStock

我正在开发从不同来源(RESTAPI)收集数据并返回汇总数据的后端

所以我从一个API请求数据。来自该API的响应(所有西里尔字符看起来都不错)描述为
@Data class ProductSku{private string label;private boolean isInStock;}

[
{
//…忽略许多未使用的字段
“标签”:“1ГББ73-75СМ”,
“isInStock”:正确
},
{
//…忽略许多未使用的字段
“标签”:“2ГБа82-88СМ”,
“isInStock”:正确
}
]
然后我允许从我的后端端点请求它和其他数据:

@GetMapping(path=“products/{prodId}”,products={“application/json;charset=UTF-8”,“*/*;charset=UTF-8”})
public ProductEntity getProduct(@PathVariable(“prodId”)int prodId){
返回catalogService.getProduct(prodId);
}
类目录服务{
公共产品实体getProduct(int prodId){
// ...
//来自其他API的ommited填充结果
List productSkus=stockClient.getProductSkus(prodId);
productEntity.addSkus(productSkus);
返回产品实体;
}
}
类StockClient{
公共列表GetProductSKU(int prodId){
//使用restTemplate
//按参数productId查询
ProductData[]productsData;
试一试{
var headers=新的HttpHeaders();
headers.set(HttpHeaders.CONTENT_类型,“application/json;charset=UTF-8”);
set(HttpHeaders.PRAGMA,“无缓存”);
set(HttpHeaders.CACHE_控件,“无缓存”);
var uri=UriComponentsBuilder.fromHttpUrl(apiUrl).queryParam(“productId”,prodId).build().toUri();
var requestEntity=requestEntity.get(uri).headers(headers.build();
productsData=restTemplate.exchange(requestEntity,ProductData[].class).getBody();
}捕获(…){
//... 
}
//在此处转换为列表
返回新数组.asList(productData);
}
}
// ...
因此,我的回答是:

{
// ...
“SKU”:[
{
“尺寸”:“1 u0433u043Eu0434 73-75 u0441u043C”,
“inStock”:正确
},
{
“尺寸”:“2 U0433U043EU0434U043082-88 u0441u043C”,
“inStock”:正确
}
]
// ...
}
如您所见,我得到的是
“2 u0433u043Eu0434u0430 82-88 u0441u043C”

来自其他API的西里尔字母符号正常显示


我希望得到您的帮助

uxxx
丢失之前它是否得到反斜杠?我看到了几个问题(但我不太了解Java和Spring):有人将数据il转换为
2\u0433(…)
这是正确的Unicode(但尚未编码为UTF-8)。这个字符串被错误地转换(我假设)使用“`而不是转义序列。某些部分将消除有问题的字符。这是非常错误和不安全的(替换、从不删除,或者滥用这些方法跳过其他检查有很高的安全风险)。@fluffy来自源API,它是西里尔文符号“2Гаа82-88а”,在我从后端返回此字符串后,它如上图所示-作为unicode代码点,没有任何反斜杠。@GiacomoCatenazzi这很奇怪,因为我没有自己进行任何转换。可能是Jackson的掩护下发生了某些事情,所以发生了这种行为。@Бааиааа这有点奇怪(到现在为止)我猜您必须进行调试:首先确保您的
productsData
不会通过简单地将西里尔字符记录到字符串中而丢失这些字符。如果可以,第二,确保您的控制器不会对响应实体进行任何错误的转换(很难相信HTTP消息转换器会这样做,所以可能有些过滤器会这样做。)它在
uxxx
s丢失之前是否会出现反斜杠?我发现了几个问题(但我不太了解Java和Spring):有人将数据il转换为
2\u0433(…)
哪个是正确的(但尚未编码为UTF-8。此字符串被错误地转换(我假设)为``而不是转义序列。某些部分将消除有问题的字符。这是非常错误和不安全的(替换、从不删除或滥用此类方法跳过其他检查的高安全风险).@fluffy来自源API,它是西里尔语符号“2Γааа82-88аМ”,在我从后端返回此字符串后,它如上图所示-作为unicode代码点,没有任何反斜杠。@GiacomoCatenazzi这很奇怪,因为我没有自己进行任何转换。可能是Jackson的掩护下发生了某些事情,所以发生了这种行为。@Бааиааа这有点奇怪(到现在为止)我猜您必须进行调试:首先确保您的
productsData
不会通过简单地将西里尔字符记录到字符串中而丢失这些字符。如果可以,第二,确保您的控制器不会对响应实体进行任何错误的转换(很难相信HTTP消息转换器会做到这一点,所以可能有一些过滤器会做到)。