2011-05-13 32 views
3

我有一個Map,LinkedHashMap更準確。 我想把一個字符串對象給它。 然後我讀取這個值來查看實際存儲的內容。 該字符串本身具有非ASCII字符(西里爾文,韓文等)。 一旦我把它放到地圖然後閱讀,這些字符被替換爲???。 部分代碼:爪哇地圖,如何正確地把UTF-8字符串放到地圖上?

Map obj = new LinkedHashMap(); 
System.out.println("name: " + getName()); // prints "i4niac_сим_sim" 
obj.put("name", getName()); 
System.out.println("written stuff: " + obj.get("name")); // prints i4niac_???_sim 

這裏有什麼竅門? 我正在使用此映射使用json-simple創建JSON對象並將其從服務器發送到客戶端。

更新:

呃,對不起,所有的混亂。 首先我責備數據存儲,然後映射,最終,如預期的那樣,這是我的錯在另一個地方。 我在App Engine中設置內容類型發送JSON數據作爲「應用/ JSON」

public void doPost(HttpServletRequest req, HttpServletResponse resp) { 
// ... 
     resp.setContentType("application/json"); 
     resp.getWriter().println(jsonObj.toString()); 
} 

它只是不會發送它爲UTF-8,不管我試過後端一側技巧。 改變到

resp.setCharacterEncoding("UTF-8"); 

後我終於接收到針對非ASCII字符的UTF-8轉義碼。

+0

請在您正確打印結果顯示其他UTF-8字符串的終端?這可能是一個字體問題... – 2011-05-13 14:50:23

+0

嗨,你可以看到我已經完全改變了這個問題。 從數據存儲區正確讀取數據,我的錯誤忽略了它。問題在於使用Map,我把UTF-8字符串放在那裏,然後變得「醜陋」。 – i4niac 2011-05-13 15:11:56

+0

查看編碼的系統屬性。我的意思是來自同一個程序的System.getProperty(「file.encoding」)(JVM)。 – ssedano 2011-05-13 15:14:21

回答

0

你怎麼知道字符被替換??? - 是不是您的控制檯設置爲ASCII代碼頁或類似的情況?或者不是你在控制檯中使用的字體不能正確處理UTF-8字符?你有沒有試圖將所有這些文件寫入一個文件,並打開它像MS Word一樣,並驗證是否是這種情況?

+0

根據他的代碼示例,他將值添加到地圖之前將其打印出來,並且在該點反映控制檯/字體理論時顯示得很好。 – 2011-05-13 15:22:22

0

重新編譯代碼-encoding標誌

這樣

javac -encoding UTF-8 Test3.java 
0

Java的地圖,如何正確地把UTF-8字符串的地圖?

字符串不可變且始終編碼爲UTF-16。如果您想以任何其他編碼表示字符數據,則必須使用字節數組。

由於LinkedHashMap不改變或序列化您的字符串,您放入它的對象值應該是返回的值。

我能想到的唯一解釋:

  • getName()不參照每
  • System.outPrintWriter被同時修改
  • 的編碼時間(最有可能)返回到相同的字符串接收數據的控制檯被同時修改

您可以將字符串的十六進制格式發送到en確保顯示的bug都沒有問題:

public static String toCodeUnits(String s) { 
    StringBuilder sb = new StringBuilder(); 
    for(char codeUnit : s.toCharArray()) { 
    sb.append(String.format("%04x ", (int) codeUnit)); 
    } 
    return sb.toString(); 
} 

對於i4niac_сим_sim,該代碼將返回:

"0069 0034 006e 0069 0061 0063 005f 0441 0438 043c 005f 0073 0069 006d "