主要的特殊字符:英文(半角)狀態的 單引號 ‘ 雙引號" 斜杠 \ 反斜杠 / and符號& 大於號 > 小於號 < 空格
9個特殊符號,可以采取錄入的時候進行控制,禁止輸入。或者在存入數據庫的時候進行轉義。或者從數據庫取出時候轉義。或者在頁面進行轉義替換等方案。
涉及到:特殊字符可能對 數據庫代碼 js造成錯誤。所以要考慮 數據庫特殊字符 編寫語言特殊字符 html頁面特殊字符等。
方案一、存入數據庫前對數據進行轉義
json串中包含特殊的字符時,可用正則過濾,把特殊的字符改成對應的,存入數據庫
value.replace(/\&/g,"&").
replace(/\"/g,""").
replace(/\'/g,"'").
replace(/\</g,"<").
replace(/\>/g,">")
原文鏈接:https://blog.csdn.net/liushuiziyouliu/article/details/76348830
方案二 從數據庫中取出json返回前台之前轉化:
注意:對單引號這個方法不適用,單引號只能存數據庫之前進行轉義
public static String stringToJson(String s) {
StringBuffer sb = new StringBuffer ();
for (int i=0; i<s.length(); i++) {
char c = s.charAt(i);
switch (c) {
case '\"':
sb.append("\\\"");
break;
// case '\\': //如果不處理單引號,可以釋放此段代碼,若結合下面的方法處理單引號就必須注釋掉該段代碼
// sb.append("\\\\");
// break;
case '/':
sb.append("\\/");
break;
case '\b': //退格
sb.append("\\b");
break;
case '\f': //走紙換頁
sb.append("\\f");
break;
case '\n':
sb.append("\\n"); //換行
break;
case '\r': //回車
sb.append("\\r");
break;
case '\t': //橫向跳格
sb.append("\\t");
break;
default:
sb.append(c);
}}
return sb.toString();
}
java 單引號保存數據庫之前進行單獨的處理之后在保存數據庫:
public static String StringDanYinToJSON(String ors) {
ors = ors == null ? "" : ors;
StringBuffer buffer = new StringBuffer(ors);
int i = 0;
while (i < buffer.length()) {
if (buffer.charAt(i) == '\'' || buffer.charAt(i) == '\\') {
buffer.insert(i, '\\');
i += 2;
} else {
i++;
}
}
return buffer.toString();
}
方案三 js解決辦法 使用JSON.parse()前 把特殊字符串進行替換
方案四、從數據庫取出后處理
在對數據庫取出來的數據(特別是描寫敘述信息)里面含有特殊字符的話。使用JSON.parse將json字符串轉換成json對象的時候會出錯,主要是雙引號,回車換行等影響明顯,左尖括號和右尖括號也會導致顯示問題,所以要在輸出到頁面進行json對象轉換之前將一些特殊符合進行編碼或轉義,以下展示的是C#代碼編碼和轉義幾個經常使用特殊字符。經過筆者測試,將這些符號編碼和轉義之后,大部分json字符串都能夠轉換成json對象了。假設遇到個別問題,應朝着這個方向去查找問題。
theString = theString.Replace(">", ">"); theString = theString.Replace("<", "<"); theString = theString.Replace(" ", " "); theString = theString.Replace("\"", """); theString = theString.Replace("\'", "'"); theString = theString.Replace("\\", "\\\\");//對斜線的轉義 theString = theString.Replace("\n", "\\n"); theString = theString.Replace("\r", "\\r");
注意:\r是回到行首。\n是新啟一行,這兩個一般同一時候出現,應該同一時候處理。
補充:文字中間的換行,空格在數據庫里面不以\r\n, ;等形式顯示出來(“本書”與“前80”之間換行。“由”與“曹雪芹”之間空格)
文字:
數據庫: