zoukankan      html  css  js  c++  java
  • 当html中存在url中如: onclick="toView('参数1')", 参数1是特别字符,如&asop;"' "等时,浏览器解析时会报错。解决方法如文中描述

    解决方案: 自定义标签将字符串转换成unicode编码后输出显示到页面即可

    解析原理:解析顺序html  ---url ----javascript---url,由于unicode编码在htm解析阶段
    不被解析保留原来文本格式,在javascript触发时才解析。
    因此要让页面不报错,文本保留原格式,采用unicode转换即可。


    以单引号为例,单引号表达方式有以下几种
    '    "    u0027    '
    查看document树发现只有u0027保持原来的文本格式。浏览器便不会报错,这是我们想要的。
    而且在js调用时,会将unicode转换回原本格式,提交到后台。
    原内容    unicode编码格式
    '             u0027
    "    u0026u0071u0075u006fu0074u003b

    u0027   u005cu0075u0030u0030u0032u0037

    '     u0026u0023u0033u0039u003b


    流程:
    自定义标签将原格式转换成unicode显示到页面
    js将unicode转换成原格式提交到后台
    后台用原格式参数去查询 
     
    unicode编码简而言之就是将每一个字符用16位2进制数标识。但是通常都用4位的16进制数标识。 
    例如: 
    1)中文字符串"你好"的unicode码为:u60u597d; 
    2)英文字符串"ab"的unicode码为:u0061u0062; 
    其中u是标识unicode码用的,后面的4位16进制数则是对应字符的unicode码。 

    unicode码在J2EE项目中应用广泛,java对unicode码提供了很好的支持。例如国际化,则是unicode的经典运用。 
    那么unicode的编码规则具体是什么,如何用程序实现? 

    1、unicode编码规则 

       unicode码对每一个字符用4位16进制数表示。具体规则是:将一个字符(char)的高8位与低8位分别取出,转化为16进制数, 
       如果转化的16进制数的长度不足2位,则在其后补0,然后将高、低8位转成的16进制字符串拼接起来并在前面补上"u" 即可。 
       
    2、转码程序 

    1)字符串转unicode 

    /** 
    * 将字符串转成unicode 
    * @param str 待转字符串 
    * @return unicode字符串 
    */ 
    public String convert(String str) 

    str = (str == null ? "" : str); 
    String tmp; 
    StringBuffer sb = new StringBuffer(1000); 
    char c; 
    int i, j; 
    sb.setLength(0); 
    for (i = 0; i < str.length(); i++) 

    c = str.charAt(i); 
    sb.append("\u"); 
    j = (c >>>8); //取出高8位 
    tmp = Integer.toHexString(j); 
    if (tmp.length() == 1) 
    sb.append("0"); 
    sb.append(tmp); 
    j = (c & 0xFF); //取出低8位 
    tmp = Integer.toHexString(j); 
    if (tmp.length() == 1) 
    sb.append("0"); 
    sb.append(tmp); 


    return (new String(sb)); 



    2)unicode转成字符串,与上述过程反向操作即可 
    /** 
    * 将unicode 字符串 
    * @param str 待转字符串 
    * @return 普通字符串 
    */ 
    public String revert(String str) 

    str = (str == null ? "" : str); 
    if (str.indexOf("\u") == -1)//如果不是unicode码则原样返回 
    return str; 

    StringBuffer sb = new StringBuffer(1000); 

    for (int i = 0; i < str.length() - 6;) 

    String strTemp = str.substring(i, i + 6); 
    String value = strTemp.substring(2); 
    int c = 0; 
    for (int j = 0; j < value.length(); j++) 

    char tempChar = value.charAt(j); 
    int t = 0; 
    switch (tempChar) 

    case 'a': 
    t = 10; 
    break; 
    case 'b': 
    t = 11; 
    break; 
    case 'c': 
    t = 12; 
    break; 
    case 'd': 
    t = 13; 
    break; 
    case 'e': 
    t = 14; 
    break; 
    case 'f': 
    t = 15; 
    break; 
    default: 
    t = tempChar - 48; 
    break; 


    c += t * ((int) Math.pow(16, (value.length() - j - 1))); 

    sb.append((char) c); 
    i = i + 6; 

    return sb.toString(); 
     
  • 相关阅读:
    Git fetch和git pull的区别
    git add 命令详解
    第1章——算法在计算机中的作用
    Mysql数据库中的计数器表实时更新
    Windows 7 搭建 nodejs、npm、express 环境
    设计模式之工厂模式
    设计模式之单例模式(Singleton Pattern)
    java实现合并两个已经排序的列表
    Spring+SpringMVC+Mybatis+Maven+CXF+WebService整合之服务端
    sqlserver乱码问题解决
  • 原文地址:https://www.cnblogs.com/huzefeng/p/5042946.html
Copyright © 2011-2022 走看看