1、問題
開發中發現這種情況,中文變成了奇怪的字符,由 &# + 數字 + 分號組成,比如訂單列表變成了 订单列表
這種稱爲NCR(numeric character reference)
字符值引用(numeric character reference, NCR)是在標記語言SGML以及派生的如HTML與XML中常見的一種轉義序列結構,用來表示Unicode的通用字符集 (UCS)中的單個字符. NCR可以表示在一個特定文檔中不能直接編碼的字符,而該標記語言閱讀器軟件把每個NCR當作一個字符來處理。
2、NCR字符轉換
使用StringEscapeUtils將普通漢字轉爲NCR:
public class SongsirTest {
public static void main(String[] args) {
String s = "訂單列表";
System.out.println(StringEscapeUtils.escapeHtml(s));
}
}
輸出結果:
订单列表
使用StringEscapeUtils將NCR轉爲普通字符:
public static void main(String[] args) {
String s = "订单列表";
System.out.println(StringEscapeUtils.unescapeHtml(s));
}
輸出結果:訂單列表
3、在前端將NCR轉爲普通字符
var title = "订单列表"
var regex = /&#(\d+);/g;
title = title.replace(regex, function(_, $1) {
return String.fromCharCode($1);
})
注:系統爲了防止注入攻擊後臺將請求轉爲了NCR導致漢字在前端展示異常。