【问题标题】:Unicode Text content changes using Java使用 Java 更改 Unicode 文本内容
【发布时间】:2017-09-05 06:40:41
【问题描述】:

在发送 unicode 文本时使用 Sms Gateway http api 可以正常工作,

नमस्ते 的 Unicode:

%26%232344%3B%26%232350%3B%26%232360%3B%26%232381%3B%26%232340%3B%26%232375%3B 

如果我在浏览器中的 SMS 网关提供的以下 API 上发送此 Unicode。

http://msdgweb.mgov.gov.in/esms/sendsmsrequest?username=*****&password=****&smsservicetype=unicodemsg&content=%26%232344%3B%26%232350%3B%26%232360%3B%26%232381%3B%26%232340%3B%26%232375%3B&mobileno=*****&senderid=****

我在手机上收到的短信是:नमस्ते:

在 Java 中使用相同的 API 时,我尝试使用 UTF-8 Unicode,文本与 %26%232344%3B%26%232350%3B%26%232360%3B%26%232381%3B%26%232340%3B%26%232375%3B 相同。

我在应用程序代码方面遗漏了什么?

【问题讨论】:

  • ...对于那些好奇的人来说,文中所谓的“Unicode”是urlencoded नमस्ते
  • URF-8 是什么?
  • 它的 utf-8 我用 utf-8 试过

标签: java unicode


【解决方案1】:
String text = "नमस्ते";

文本不知何故被翻译成 HTML 实体:

नमस्ते

当将 HTML 表单发布到未声明其接受(例如)UTF-8 (Unicode) 的服务器时,可能会发生这种情况。然后浏览器翻译输入字段。 还要在表格中说明:

<form action="..." accept-charset="UTF-8">

然后这个字符串被 URL 编码,&amp;%2B 等等。

作为重新转换 HTML 实体 (&amp;#1234;) 的补丁,请使用 Apache common:

s = StringEscapeUtils.unescapeHTML(s);

或者转换自己:

String convertHtmlEntities(String s) {
     Pattern pattern = Pattern.compile("\\&#(\\d{1,7});");
     Matcher m = patter.matcher(s);
     StringBuffer sb = new StringBuffer();
     while (m.find()) {
         int cp = Integer.parseInt(m.group(1));
         String ch = new String(new int[] { cp }, 0, 1);
         m.appendReplacement(sb, ch);
     }
     m.appendTail(sb);
     return sb.toString();
}

【讨论】:

  • 感谢@joop 的回复,请问 unescapeHTML 是干什么用的?
  • 翻译 HTML 实体,这里的 &amp;#12345; 形式为真实字符。您需要将 apache commons 库添加到项目中。因此,或者convertHtmlEntities 函数。
猜你喜欢
  • 1970-01-01
  • 2020-04-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-21
  • 2017-04-14
  • 1970-01-01
  • 1970-01-01
  • 2022-10-08
相关资源
最近更新 更多