XML乱码? Java replace乱码?

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,不然会被搞死的.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值