<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 22  文章 - 467  trackbacks - 0
    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    常用鏈接

    留言簿(25)

    隨筆分類(74)

    文章分類(1)

    收藏夾(277)

    在線工具

    在線資料

    最新隨筆

    搜索

    •  

    積分與排名

    • 積分 - 217556
    • 排名 - 260

    最新評論

    閱讀排行榜

    評論排行榜

    有些網站,特別是有些網站的手機版,喜歡直接輸出類似
    &# x6B22;&# x8FCE;&# x6765;&# x5230;Aloong&# x7684;Java&# x535A;&# x5BA2;!
    (全部插入了空格避免被轉義,下面的代碼中也都加了空格)
    這類16進制網頁編碼,雖然我們的瀏覽器可以顯示出正確的文字,但是看源代碼的時候就是滿眼的亂碼了.
    于是在需要寫處理網頁代碼的程序就可能遇到轉換這些編碼的問題.

    以下分享兩個我轉換這種編碼的兩個例子.

    1. 解碼:
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;

    /**
     * @ClassName: TestDecode 
     * @Description: 解碼16進制網頁編碼的例子 
     * 
    @author Aloong 
     * @date 2010-10-25 上午02:19:59 
     * 
     
    */

    public class TestDecode
    {

        
    public static void main(String[] args)
        
    {
            String pageCode 
    = "<span>&# x6B22;&# x8FCE;&# x6765;&# x5230;Aloong&# x7684;Java&# x535A;&# x5BA2;!</span>";
            Pattern p;
            Matcher m;
            
            
    //將"&# x6B22;"轉換為"\u6B22"
            p = Pattern.compile("&#x[\\d\\w]{4};",Pattern.DOTALL);
            m 
    = p.matcher(pageCode);
            
    while (m.find())
            
    {
                String group 
    = m.group();
                pageCode 
    = pageCode.replaceAll(group, "\\\\u" + group.substring(37).toUpperCase());
            }

            
    //去掉html標簽的正則表達式
            pageCode = pageCode.replaceAll("<[^>]*>""");
            
    //解碼:
            pageCode = loadConvert(pageCode);
            
            System.out.println(pageCode);
        }

        
        
    private static String loadConvert(String theString)
        
    {
            
    char aChar;
            
    int len = theString.length();
            StringBuffer outBuffer 
    = new StringBuffer(len);
            
    for (int x = 0; x < len;)
            
    {
                aChar 
    = theString.charAt(x++);
                
    if (aChar == '\\')
                
    {
                    aChar 
    = theString.charAt(x++);
                    
    if (aChar == 'u')
                    
    {
                        
    int value = 0;
                        
    for (int i = 0; i < 4; i++)
                        
    {
                            aChar 
    = theString.charAt(x++);
                            
    switch (aChar)
                            
    {
                            
    case '0':
                            
    case '1':
                            
    case '2':
                            
    case '3':
                            
    case '4':
                            
    case '5':
                            
    case '6':
                            
    case '7':
                            
    case '8':
                            
    case '9':
                                value 
    = (value << 4+ aChar - '0';
                                
    break;
                            
    case 'a':
                            
    case 'b':
                            
    case 'c':
                            
    case 'd':
                            
    case 'e':
                            
    case 'f':
                                value 
    = (value << 4+ 10 + aChar - 'a';
                                
    break;
                            
    case 'A':
                            
    case 'B':
                            
    case 'C':
                            
    case 'D':
                            
    case 'E':
                            
    case 'F':
                                value 
    = (value << 4+ 10 + aChar - 'A';
                                
    break;
                            
    default:
                                
    throw new IllegalArgumentException(
                                        
    "Malformed   \\uxxxx   encoding.");
                            }

                        }

                        outBuffer.append((
    char) value);
                    }
     else //可選是否轉換這些字符
                    {
                        
    if (aChar == 't')
                            aChar 
    = '\t';
                        
    else if (aChar == 'r')
                            aChar 
    = '\r';
                        
    else if (aChar == 'n')
                            aChar 
    = '\n';
                        
    else if (aChar == 'f')
                            aChar 
    = '\f';
                        outBuffer.append(aChar);
                    }

                }
     else
                    outBuffer.append(aChar);
            }

            
    return outBuffer.toString();
        }


    }
    以上程序可以輸出:"歡迎來到Aloong的Java博客!"

    2. 編碼:
    /**
     * @ClassName: TestEncode 
     * @Description: 編碼16進制網頁編碼的例子 
     * 
    @author Aloong 
     * @date 2010-10-25 上午02:31:58 
     * 
     
    */

    public class TestEncode
    {

        
    public static void main(String[] args)
        
    {
            String str 
    = "歡迎來到Aloong的Java博客!";

            str 
    = toUnicode(str, false);

            System.out.println(str);
        }


        
    public static String toUnicode(String theString, boolean escapeSpace)
        
    {
            
    int len = theString.length();
            
    int bufLen = len * 2;
            
    if (bufLen < 0)
            
    {
                bufLen 
    = Integer.MAX_VALUE;
            }

            StringBuffer outBuffer 
    = new StringBuffer(bufLen);

            
    for (int x = 0; x < len; x++)
            
    {
                
    char aChar = theString.charAt(x);
                
    // Handle common case first, selecting largest block that
                
    // avoids the specials below
                if ((aChar > 61&& (aChar < 127))
                
    {
                    
    if (aChar == '\\')
                    
    {
                        outBuffer.append(
    '\\');
                        outBuffer.append(
    '\\');
                        
    continue;
                    }

                    outBuffer.append(aChar);
                    
    continue;
                }

                
    switch (aChar)
                
    {
                
    case ' ':
                    
    if (x == 0 || escapeSpace)
                        outBuffer.append(
    '\\');
                    outBuffer.append(
    ' ');
                    
    break;
                
    case '\t':
                    outBuffer.append(
    '\\');
                    outBuffer.append(
    't');
                    
    break;
                
    case '\n':
                    outBuffer.append(
    '\\');
                    outBuffer.append(
    'n');
                    
    break;
                
    case '\r':
                    outBuffer.append(
    '\\');
                    outBuffer.append(
    'r');
                    
    break;
                
    case '\f':
                    outBuffer.append(
    '\\');
                    outBuffer.append(
    'f');
                    
    break;
                
    //可選是否轉義這些字符
    //            case '=': // Fall through
    //            case ':': // Fall through
    //            case '#': // Fall through
    //            case '!':
    //                outBuffer.append('\\'); outBuffer.append(aChar);
    //                break;
                default:
                    
    if ((aChar < 0x0020|| (aChar > 0x007e))
                    
    {
                        
    //添加前綴"&#x",可以改成其他前綴如"\\u"
                        outBuffer.append("&#x");
                        outBuffer.append(toHex((aChar 
    >> 12& 0xF));
                        outBuffer.append(toHex((aChar 
    >> 8& 0xF));
                        outBuffer.append(toHex((aChar 
    >> 4& 0xF));
                        outBuffer.append(toHex(aChar 
    & 0xF));
                        
    //添加后綴";"
                        outBuffer.append(';');
                    }
     else
                    
    {
                        outBuffer.append(aChar);
                    }

                }

            }

            
    return outBuffer.toString();
        }


        
    //查詢16進制對應表
        private static char toHex(int nibble)
        
    {
            
    return hexDigit[(nibble & 0xF)];
        }

        
    private static final char[] hexDigit =
        
    '0''1''2''3''4''5''6''7''8''9''A''B''C''D',
                
    'E''F' }
    ;

    }
    以上程序輸出:
    &# x6B22;&# x8FCE;&# x6765;&# x5230;Aloong&# x7684;Java&# x535A;&# x5BA2;!
    (這里在x的前面都加了空格,不然會被瀏覽器自動轉成文字的.)
    以上兩個轉換代碼也是網上找到了,只是自己稍作修改并寫了例子.
    posted on 2010-10-25 02:48 ApolloDeng 閱讀(2023) 評論(1)  編輯  收藏 所屬分類: 分享JavaWeb

    FeedBack:
    # re: 類似"&# x6B22;"這類16進制網頁編碼的編碼與解碼方法 2011-12-10 21:52 tbw淘寶商城
    我這就去試試。  回復  更多評論
      
    主站蜘蛛池模板: 欧洲 亚洲 国产图片综合| 91在线老王精品免费播放| 亚洲国产电影在线观看| 亚洲伊人成无码综合网| 最近最新MV在线观看免费高清| 三年在线观看免费观看完整版中文 | 色窝窝免费一区二区三区| 黄网站免费在线观看| 成人免费夜片在线观看| 亚洲国产精品无码中文lv| 亚洲高清日韩精品第一区| 久久国产亚洲精品麻豆| 亚洲色偷拍区另类无码专区| 日本高清免费aaaaa大片视频| 免费观看激色视频网站(性色)| 麻豆精品不卡国产免费看| 国产精品一区二区三区免费 | 国产又粗又长又硬免费视频| 日韩精品无码区免费专区 | 亚洲AV日韩AV永久无码免下载| 老司机亚洲精品影视www| 免费精品国产自产拍观看| 免费毛片网站在线观看| 18禁成年无码免费网站无遮挡| 精品香蕉在线观看免费| 91短视频免费在线观看| 99久热只有精品视频免费看| 久久免费观看国产精品| A片在线免费观看| 精品人妻系列无码人妻免费视频| 无码人妻一区二区三区免费视频| 国产青草亚洲香蕉精品久久| jizzjizz亚洲日本少妇| 国产在亚洲线视频观看| 欧洲美女大片免费播放器视频 | 精品久久免费视频| 免费观看美女裸体网站| 国产一级淫片a免费播放口之| 国产在线19禁免费观看国产| 免费大黄网站在线观| 亚洲成a人无码av波多野按摩|