从属性文件java中读取unicode字符

时间:2016-08-17 07:03:59

标签: java unicode

请帮我从java中的属性文件中读取UNICODE字符。例如:如果我传递密钥" Account.label.register"它应该归还给我,因为" \ u5BC4 \ u5B58 \ u5668"但不是它的字符表示,如"寄存器" 。这是我的示例属性文件

file_ch.properties

Account.label.register = \u5BC4\u5B58\u5668 
Account.label.login = \u767B\u5F55 
Account.label.username = \u7528\u6237\u540D 
Account.label.password = \u5BC6\u7801 

谢谢。

嗨,我正在使用以下java代码

读取属性文件
@Override
public ResourceBundle getTexts(String bundleName) {
    ResourceBundle myResources = null;
    try {
        myResources = ResourceBundle.getBundle(bundleName, getLocale());
    } catch (Exception e) {
        myResources = ResourceBundle.getBundle(getDefaultBundleKey(), getLocale());
    }
    return myResources;
}

使用上述方法可以,我正在收到中文字符。但是对于我的应用程序中的一些ajax请求,我需要在X-JSON头中传递中文文本。示例代码如下所示

    HashMap<String, List<String>> map = new HashMap<String, List<String>>();
    List<String> errors = new ArrayList<String>();
    errors.add(str);   /*ex: str = "无效的代码" , value taken from properties file through resource bundle*/
    map.put("ERROR", errors);
    JSONObject json = JSONObject.fromObject(map);
    response.setCharacterEncoding("UTF-8");
    response.setHeader("X-JSON", json.toString());
    response.setStatus(500);

我正在传递英语,例如str =&#34; Invalid Code&#34; X-JSON标头按原样携带信息。但是如果str =&#34;无效的代码&#34; (中文或任何其他文本)X-JSON标题将文本视为空,如下所示是我得到的响应

 response :

 connection:close
 Content-Encoding:gzip
 Content-Type:text/html;charset=UTF-8
 Date:Wed, 08 Jun 2016 10:17:43 GMT
 Server:Apache-Coyote/1.1
 Transfer-Encoding:chunked
 Vary:Accept-Encoding
 X-JSON:{"ERROR":["Invalid Code"]}

但是如果&#34;错误&#34;包含&#34;中文&#34; ex:&#34;无效的代码&#34;

的文字

回复:

 connection:close
 Content-Encoding:gzip
 Content-Type:text/html;charset=UTF-8
 Date:Wed, 08 Jun 2016 10:17:43 GMT
 Server:Apache-Coyote/1.1
 Transfer-Encoding:chunked
 Vary:Accept-Encoding
 **X-JSON:{"ERROR":["  "]}**   /*expecting the response X-JSON:{"ERROR":["无效的代码"]}*/

由于中文文本是空的,我想通过X-JSON标题发送unicode,如下所示

{"ERROR":["\u65E0\u6548\u7684\u4EE3\u7801"]}  

之后想要在评估X-JSON标题之后使用Javascript代码解析Unicode字符,如下所示

var json;
  try {
    json = xhr.getResponseHeader('X-Json');
  } catch (e) {
    alert(e);
 }

  if (json) {
    var data = eval('(' + json + ')'); 
    decodeMsg(data);
  }


  function decodeMsg(message) {
    var mssg =  message;
    var r = /\\u([\d\w]{4})/gi;
    mssg = mssg.replace(r, function (match, grp) {
        return String.fromCharCode(parseInt(grp, 16)); } );
    mssg = unescape(mssg);

    return mssg;
 }

请提出建议。谢谢。

2 个答案:

答案 0 :(得分:2)

错误是在HTTP中标题行是ISO-8859-1,基本的Latin-1。 解决方案是使用%XX转换UTF-8字节(在这种情况下)。 但是,如果JSON只是按照您的意图执行,那么您可以获得更好的服务。

所以你想使用\uXXXX发送u-escaped Unicode。不仅Java,而且JavaScript / JSON都知道这个约定,你只需要在服务器上的java中进行u-escaping。

static String uescape(String s) {
    StringBuilder sb = new StringBuilder(s.length() * 6);
    for (int i = 0; i < chars.length; ++i) {
        char ch = s.charAt(i);
        if (ch < 128) {
            sb.append(ch);
        } else {
            sb.append(String.format("\\u%04X", (int) ch));
        }
    }
    return sb.toString();
}

errors.add(uescape(str));

将每个非ASCII(>=128)字符的零填充为4位十六进制,即确切的格式。

或者使用apache-commons StringEscapeUtils.escapeJava,它也引用了引号\n等等 - 更安全。

答案 1 :(得分:1)

通过将属性文件加倍来转义属性文件中的反斜杠:

Account.label.register = \\u5BC4\\u5B58\\u5668 
Account.label.login = \\u767B\\u5F55 
Account.label.username = \\u7528\\u6237\\u540D 
Account.label.password = \\u5BC6\\u7801