输入字符串编码,需要原始字符串 - Java代码
我有一个REST Web服务,它以JSON(作为多部分表单数据)的形式输入。输入字符串编码,需要原始字符串 - Java代码
@POST
@Consumes ({"application/ds-json",MediaType.APPLICATION_FORM_URLENCODED,MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML,"text/html",MediaType.MULTIPART_FORM_DATA})
@Produces({ text_html, "application/ds-json" })
@Path("/abc")
public Response abc(@Context HttpServletRequest req, @Context HttpServletResponse response){
.
.
.
.
String strInput = inputJSON.getString("data");
.
.
.
}
输入JSON,我送是{"data":"Sécurité"}
,而串strInput
我得到的价值是Sécurité
我试图java.net.URLDecoder.decode(strInput, "iso-8859-1")
将其解码回其原有的特色,但未能成功。
我也试过String strInput = new String((inputJSON.getString("data")).getBytes(), "iso-8859-1");
预期传入的字符将按照需求存储在变量strInput
中,但失败。
我觉得完全迷失在这里。有人可以帮忙吗?
编辑:
更清晰,下面是究竟如何我送了JSON这一服务(仅用于测试目的):
- 我已经创建了一个HTML页面可以发送POST请求的Web服务
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="http://localhost:8080/xxxx/abc" method="POST" enctype="multipart/form-data">
JSON:
<input type="text" name="data">
<input type="submit" name="submit">
</form>
</body>
</html>
- 在页面,我输入文本作为使用
UTF-16
Sécurité
谢谢大家,我总算解决这个问题,@ kayaman的评论帮助我到达这里
你看到的是UTF-8的数据解码为ISO-8859-1。 - Kayaman
我刚转换的输入字符串strInput
到字节每ISO-8859-1
编码和再次创建新的字符串按照UTF-8
编码。这为我做了这份工作。
byte[] inputBytes = strInput.getBytes("iso-8859-1");
strInput = new String(inputBytes, "UTF-8");
早些时候,我获取输入字符串的字节byte[] inputBytes = strInput.getBytes();
它默认是返回我这是比我预期的额外字节UTF-8
解码的位元(我提到,@Kayaman):
@Kayaman是的,你是非常正确的,我在一个单独的测试课上进行测试。但在我目前的情况下(网络服务),我作为输入获得的数据似乎以某种方式被破坏。我试图打印输入和期望的字符串的字节:字节[] S = strInput.getBytes(“UTF-8”); byte [] s1 =“安全”.getBytes(“UTF-8”);其结果是:s = [83,-61,-125,-62,-87,99,117,114,105,116,-61,-125,-62,-87] s1 = [83,-61, -87,99,117,114,105,116,-61,87]这两个应该是相同的,但是我得到额外的字节{-125,-62} - Ankan Priya
但是,作为字符串是ISO-8859-1
编码形式,我需要使用相同的解码方案来获取字节和它的工作(见上文的代码片段)
所有的Java字符存储在存储器中。问题来自传输的字节。你写
我送是
{"data":"Sécurité"}
它只是一种表象,它没有提供有关用于文本传输字节表示的信息。如果使用的表示不是响应的一部分,则接收器不能创建它。如果缺少编码,发件人和消费者都必须依赖相同的约定。例如,某些协议有默认值,但这意味着发送者和接收者都遵守标准默认值,并且它们也必须与规范同步(默认编码随时间变化)。
从您的具体问题,当您的Java请求处理器已收到发送的字节,它已使用Charset将其转换为Java char
。不支持的字节在此转换中丢失。
的可能的解决方案:
- 使发件人ALWAYS specifiy使用的编码
- 添加一个猜测基于一些请求元数据的默认编码的请求过滤器(即
User-Agent
) - 停止使用IE(如据我所知,IE8的确做错事与编码,特别是XHR)
注:must-read
文章:The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)
尝试在消耗参数添加:
+ “;字符集= UTF-8”
POR例如:
MediaType.APPLICATION_JSON +“;字符集= UTF -8“
我使用它,但与输出和工作正常。
我试过,但没有真正的帮助。整个问题仍然完全相同。 –
尝试UTF-8或UTF-16,可能? –
你在哪里看到错误的编码字符串?在你的IDE,数据库或其他地方? – Patrick
在我的IDE,后来我送这个字符串用作电子邮件主题行的电子邮件通知。还有它显示为相同的'Sécurité' –