我有一些问题,当提交一个url通过卷曲到我的api。用于测试的url参数im是&body=+%bb%3d+,它位于gms和id的特殊字符集中,假定为'~‘。
当我打印出值时,我得到'�=‘
现在我知道它不在utf-8字符集中,这就是unicode替换字符被替换的原因。
必须有一种方法将数据发送到我的服务器,而不需要替换。我使用jetty和jersey运行一个java项目。
编辑
好的,我试过了
@GET
@Produces(MediaType.TEXT_PLAIN)
public String submit(@QueryParam("from") String from, @QueryParam("to") String to, @QueryParam("body") String body) {
byte[] raw = body.getBytes(StandardCharsets.US_ASCII);
body = new String(raw, StandardCharsets.UTF_8);
System.out.println("data - " + body);打印出数据- ?=将字符集从US_ASCII更改为ISO_8859_1打印出数据- ?=
发布于 2014-10-03 13:10:24
根据HTTP推荐的字符编码是UTF-8,因此您将得到这个结果。您的代码可能依赖于RFC2616的一种很少为人所知的行为,即在没有编码的情况下,假设是ISO-8859-1,而实际上,除非声明为相反,否则这一行为会被丢弃到RFC7231中,转而支持UTF-8 everywhere。
如果在解析参数时希望使用不同的编码,请在将其从请求对象中提取出来时设置它,或者使用等效的UTF8。
例:
/* will decode all parameters, header values, and content as ISO-8859-1 */
request.setCharacterEncoding(StandardCharsets.ISO_8859_1.name());
String actual = request.getParameter("body");
System.out.println("\"" + actual + "\"");
/* output on console of : " »= " */
/* that's a RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK followed by an EQUALS */如果您想使用与此等价的UTF8,那么%C2%BB%3D
选项2,在事实之后解码原始参数。
String raw = request.getParameter("body");
byte[] bytes = raw.getBytes(StandardCharsets.ISO_8859_1); // decode
String actual = new String(bytes, StandardCharsets.UTF_8);更新#1: 2013-10月-03
设置US-ASCII时所看到的结果是正确的。
值%bb高于US的7位限制,因此它显示在替换字符中。
示例Java:
// as us-ascii
String decoded = URLDecoder.decode("+%bb%3d+",StandardCharsets.US_ASCII.name());
System.out.printf("Decoded: '%s'%n",decoded); 更新#1: 2013-10月-03
至于GSM字符集,我找不到对任何GSM字符集的内置java支持,您将希望深入研究字符集、编码等,然后,当您非常满意它时,您可以查看Java的第三方库,它将采用UTF-8或ISO-8859-1,并将它们转换为50种已出版的GSM字符集中的一种。
示例(仅指定一个GSM字符集):
http://embeddedfreak.wordpress.com/2008/10/08/java-gsm-0338-sms-character-set-translator/
或者你可以找到你想要的UTF-8字符,把它弹到一个在线UTF-8工具中(作为一个字符),并将它回溯到你使用的十六进制代码点。
https://stackoverflow.com/questions/26179006
复制相似问题