2016-08-17 14 views
2

そのままjavaのプロパティファイルからUNICODE文字を読んでください。たとえば、私が "Account.label.register"というキーを渡すと、 "\ u5BC4 \ u5B58 \ u5668"と返されますが、 "寄存器"のような文字表現は返されません。ここに私のサンプルの特性がプロパティファイルからユニコード文字を読み取るjava

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 

ありがとうファイルです。

こんにちは、私は読んでい性質は、それがOK罰金、私は漢字を取得しています上記のアプローチを使用して、次の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ヘッダーに中国語のテキストを渡す必要があります。サンプルコードは、Iは、例えば英語通過いSTR =そのまま「無効コード」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); 

以下に示します。 =「无效的代码」(中国語またはその他のテキスト)X-JSONヘッダは以下のような空のようにテキストを運んでstrがある場合しかし、私は

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"]} 

を取得しています応答がしかし、「エラー」は "が含まれている場合中国の」元のテキスト: "无效的代码"

応答:

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を送信すると考えるようその後

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; 
} 

以下のようにX-JSONヘッダを評価した後にJavaScriptコードを使用してUnicode文字を解析する提案をお願いします。ありがとうございました。

+2

あなたがこれまでに試したことを示してください。 – AlexR

+2

なぜユニコードをエスケープしますか? – Kayaman

+0

ありがとうございました。プロパティーファイルからUnicode文字を読み込む必要性に関する詳細な説明を編集した記事をご覧ください。 –

答えて

2

エラーがHTTPのヘッダ行がISO-8859-1、基本的なラテン1であるということです。 解決策は、UTF-8バイトの%XX変換を使用することです(この場合)。 JSONが意図したとおりの処理を行う場合は、より効果的です。

したがって、\uXXXXを使用して、Uエスケープされた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)); 

4桁のHex、正確な形式としてこのゼロパッド毎に、非ASCII(>=128)CHAR。

また、引用符を付けるapache-commons StringEscapeUtils.escapeJavaを使用してください。\nなど、より安全です。

+0

ありがとうございます。Joop Eggen Sir。それは私のために働いた。これほど多くの日以来、これのために苦労しています。それは私の仕事を完了するために私をたくさん救った。私はあなたにとても感謝していました。私もあなたからの説明が分かりました。 –

1
は、それらを2倍にすることにより、あなたの特性でバックスラッシュをエスケープファイル

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

こんにちは、私はあなたの答えを受け入れますが、二重にエスケープするとのようなjspファイルでコーディングするときにテキストを翻訳しません。私は、ほんの少しのケースでのみ、Unicode文字を読む必要があります。 Unicode文字の必要性については、私の編集ポストを参照してください。可能であれば、提案をお願いします。ありがとうございました。 –

関連する問題