XML 特殊符号乱码
首先强调GBK环境 不识别很多特殊符号比如:上下角标。原因我就不多说,自行百度。
常用特殊字符解决办法
//没啥特殊得解决办法,替换呗
public class SpecialSymbolsUtil {
//上标
public final static Map<String, String> supMap = new HashMap();
static {
supMap.put("℡", "TEL");
supMap.put("™", "TM");
supMap.put("⁽", "(");
supMap.put("⁾", ")");
supMap.put("⁰", "0");
supMap.put("¹", "1");
supMap.put("²", "2");
supMap.put("³", "3");
supMap.put("⁴", "4");
supMap.put("⁵", "5");
supMap.put("⁶", "6");
supMap.put("⁷", "7");
supMap.put("⁸", "8");
supMap.put("⁹", "9");
supMap.put("⁻", "-");
supMap.put("⁼", "=");
supMap.put("ʷ", "w");
supMap.put("ˣ", "x");
supMap.put("ʸ", "y");
supMap.put("ᶻ", "z");
supMap.put("⁺", "+");
supMap.put("ᵗ", "t");
supMap.put("ᵘ", "u");
supMap.put("ᵛ", "v");
supMap.put("ˡ", "l");
supMap.put("ᵐ", "m");
supMap.put("ⁿ", "n");
supMap.put("ᵒ", "o");
supMap.put("ᵖ", "p");
supMap.put("ʳ", "r");
supMap.put("ˢ", "s");
supMap.put("ᵉ", "e");
supMap.put("ᶠ", "f");
supMap.put("ᵍ", "g");
supMap.put("ʰ", "h");
supMap.put("ⁱ", "i");
supMap.put("ʲ", "j");
supMap.put("ᵏ", "k");
supMap.put("ᵁ", "U");
supMap.put("ᵂ", "W");
supMap.put("ᵃ", "a");
supMap.put("ᵇ", "b");
supMap.put("ᶜ", "c");
supMap.put("ᵈ", "d");
supMap.put("ᴹ", "M");
supMap.put("ᴺ", "N");
supMap.put("ᴼ", "O");
supMap.put("ᴾ", "P");
supMap.put("ᴿ", "R");
supMap.put("ᵀ", "T");
supMap.put("ᴳ", "G");
supMap.put("ᴴ", "H");
supMap.put("ᴵ", "I");
supMap.put("ᴶ", "J");
supMap.put("ᴷ", "K");
supMap.put("ᴸ", "L");
supMap.put("ᴬ", "A");
supMap.put("ᴮ", "B");
supMap.put("ᴰ", "D");
supMap.put("ᴱ", "E");
}
//下标
public final static Map<String, String> subMap = new HashMap();
static {
subMap.put("₍", "(");
subMap.put("₎", ")");
subMap.put("₌", "=");
subMap.put("ᵣ", "r");
subMap.put("ᵤ", "u");
subMap.put("ᵥ", "v");
subMap.put("ₓ", "x");
subMap.put("₊", "+");
subMap.put("₋", "-");
subMap.put("₉", "9");
subMap.put("ₐ", "a");
subMap.put("ₑ", "e");
subMap.put("ᵢ", "i");
subMap.put("ₒ", "o");
subMap.put("₃", "3");
subMap.put("₄", "4");
subMap.put("₅", "5");
subMap.put("₆", "6");
subMap.put("₇", "7");
subMap.put("₈", "8");
subMap.put("₀", "0");
subMap.put("₁", "1");
subMap.put("₂", "2");
}
/**
* @param text : 需要替换的文件
* @Method replaceSymbols
* @Author liqingxiao
* @Version 1.0
* @Description 替换特殊符号
* @Return string
* @Exception
* @Date 2020/3/30 15:30
*/
public static String replaceSymbols(String text) {
for (String o : supMap.keySet()) {
if (text.contains(o)) {
text = text.replace(o, supMap.get(o));
}
}
for (String s : subMap.keySet()) {
if (text.contains(s)) {
text = text.replace(s, subMap.get(s));
}
}
return text;
}
Dom4j 生成 XML 然后replace乱码
说明: replace XML时遇到特殊情况会乱码。百度有解释。
自行封装方法生成XML
//这里制作一个简单demo,可根据自己实际情况 加以改变
//str 标签名
//param 需要填充得值
StringBuffer getElement(String str, String param) {
if (StringUtils.isNotEmpty(param)) {
//XML 不识别字符 转义
if (param.contains("%")) {
param = param.replace("%", "%25");
}
if (param.contains("%")) {
param = param.replace("%", "%25");
}
if (param.contains("〜")) {
param = param.replace("〜", "%7e");
}
//特殊符号替换
param = SpecialSymbolsUtil.replaceSymbols(param);
}
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("<" + str + ">");
if (StringUtils.isNotEmpty(param)) {
stringBuffer.append("<![CDATA[" + param + "]]>");
} else {
stringBuffer.append("<![CDATA[/]]>");
}
stringBuffer.append("</" + str + ">");
return stringBuffer;
}
最后说明:笔者也是被这个问题头疼了好几天,无奈就用到了这种低级方法,不过总算解决了问题。
还有提醒大家,XML方式传输数据,最好用统一语言环境UTF-8,不然会被搞死的.