Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 老司机精品99在线播放,四房色播开心网,国内精品一区二区在线观看

          整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          html亂碼-解決gb2312編碼導致亂碼問題

          html亂碼-解決gb2312編碼導致亂碼問題

          幾天保存了網絡上的一個頁面,瀏覽器打開后,發現是亂碼。如下圖:

          亂碼網頁

          出現這個問題怎么處理呢?下面幫你解決

          頁面html源碼

          查看html,看到這里用了國標標準,看源碼截圖

          <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />

          解決方法:

          把gb2312改成utf-8即可

          修改為utf-8

          修改后的結果,如圖:

          修改后的展示

          知識分享:

          utf-8 和gb3212 的區別

          utf-8 這個是國際通用字庫,支持各種不同的語言

          gb3212這個是中國的字庫,支持簡體中文和少數外語+一些符號,文件資源少一點

          區別:utf-8跨平臺兼容性更好,由于它字庫更全所以加載會慢好多

          html的charset屬性

          charset屬性是定義HTML文檔的字符編碼格式。

          常見的字符編碼有:Unicode、utf-8、gbk、gb2312

          其中:

          gbk是國家標準的擴展版(增加了繁體并包含所有亞洲字符集)

          Unicode是國際組織制定的旨在容納全球所有字符的編碼方案,包括字符集、編碼方案等。又稱為萬國碼、統一碼、單一碼

          HTML標簽相關的字符串格式化

          string nl2br ( string $string )

          nl2br() 就是將\n 替換成 <br> //javascript對\n才能夠執行換行,對</br>是不能執行換行

          htmlspecialchars() 把一些預定義的字符轉換為 HTML 實體。

          string htmlspecialchars(string,quotestyle,[character-set])

          轉換以下字符及對應的實體

          & (和號) 成為 &
          " (雙引號) 成為 "
          ' (單引號) 成為 '
          < (小于) 成為 <
          > (大于) 成為 >

          第二個參數: ENT_COMPAT 只轉換雙引號, 保留單引號, 為默認值 compat: 兼容性

          ENT_QUOTES 同時轉換兩種引號 quotes: 引號

          ENT_NOQUOTES 不對引號進行轉換

          <html>
          <body>
          <?php
          $str="John & \" 'Adams'";
          echo htmlspecialchars($str, ENT_COMPAT);
          echo "<br />";
          echo htmlspecialchars($str, ENT_QUOTES);
          echo "<br />";
          echo htmlspecialchars($str, ENT_NOQUOTES);
          ?>
          </body>
          </html>

          輸出結果:John & " 'Adams'

          John & " 'Adams'

          John & " 'Adams'

          htmlentities() 可以將所有的非ASCII碼字符轉換為對應的實體代碼;除字母、數字、\外, 漢字和鍵盤上其他字符都轉換

          <?php
          $str="A 'quote' \" is <b>bold</b>" ;
          echo htmlentities ( $str ); // 輸出后源代碼: A 'quote' is <b>bold</b>
          echo htmlentities ( $str , ENT_QUOTES ); // 輸出后源代碼: A 'quote' is <b>bold</b>
          ?>

          返回的結果:A 'quote' "is <b>bold</b>

          A 'quote' "is <b>bold</b>

          注意: htmlspecialchars()和htmlentities作用直接輸出HTML腳本

          htmlspecialchars()和htmlentities()函數對于轉義字符"\"處理,不會轉義實體代碼,要么當轉義字符對待,要么原樣輸出;

          PHP中htmlentities和htmlspecialchars的區別

          這兩個函數的功能都是轉換字符為HTML字符編碼, 特別是url和代碼字符串。防止字符標記被瀏覽器執行。

          使用中文時沒什么區別, 但htmlentities會格式化中文字符使得中文輸入是亂碼。

          htmlentities轉換所有的html標記, htmlspecialchars只格式化& ' " < 和 > 這幾個特殊符號

          addslashes() 在指定的預定義字符前添加反斜杠。

          這些預定義字符是:單引號 (') 雙引號 (") 反斜杠 (\) NULL字符(\x00)

          提示:該函數可用于為存儲在數據庫中的字符串以及數據庫查詢語句準備合適的字符串。

          注釋:默認情況下,PHP 指令 magic_quotes_gpc 為 on,對所有的 GET、POST 和 COOKIE數據自動運行 addslashes()。

          不要對已經被magic_quotes_gpc轉義過的字符串使用 addslashes(),因為這樣會導致雙層轉義。

          遇到這種情況時可以使用函數 get_magic_quotes_gpc() 進行檢測。(如:$c=(!get_magic_quotes_gpc())?addslashes($c):$c;)

          在本例中,我們要向字符串中的預定義字符添加反斜杠:

          <?php
          $str="Who's John Adams?";
          echo $str . " This is not safe in a database query.<br />";
          echo addslashes($str) . " This is safe in a database query.";
          ?>

          輸出:

          Who's John Adams? This is not safe in a database query.

          Who\'s John Adams? This is safe in a database query.

          <?php
          header("Content-type:text/html; charset=utf-8");
          $str="wo are \x0a studying \x00 php";
          echo $str;
          echo "<br>";
          echo addslashes($str);
          ?>

          輸出:

          wo are studying php

          wo are studying >wo are studying \0 php< php



          stripslashes() 刪除反斜線("\")

          在提交的表單數據中 ' " \ 等字符前被自動加上一個\ ,這是配置文件php.ini中選項magic_quotes_gpc在起作用,

          默認是打開的,如果不處理則將數據保存到數據庫時,有可能會被數據庫誤當成控制符號而引起錯誤。

          通常htmlspecialchars()和stripslashes()函數復合的方式,聯合處理表單中的提交的數據htmlspecialchars(stripslashes())

          strip_tags()

          string strip_tags ( string $str [, string $allowable_tags ] )

          剝去 HTML、XML 以及 PHP 的標簽。

          <?php
          echo strip_tags("Hello <b><i>world!</i></b>","<b>");
          ?>

          輸出結果:Hello world!

          實例:

          <?php
          $str="<b>webserver;</b> & \ 'Linux' & Apache";
          echo "$str"; //直接輸出
          echo "<br/>";
          echo htmlspecialchars($str,ENT_COMPAT); //只轉換雙引號,為默認參數
          echo "<br />";
          echo htmlspecialchars($str,ENT_NOQUOTES); //不對引號進行轉換
          echo "<br />";
          echo htmlspecialchars($str,ENT_QUOTES); //同時轉換單引號和雙引號
          echo "<br />";
          echo htmlentities($str); //將所有的非ASCII碼字符轉換為對應的實體代碼
          echo "<br />";
          echo addslashes($str); //將" ' \ 字符前添加反斜線
          echo "<br />";
          echo stripslashes($str); //刪除反斜線
          echo "<br />";
          echo strip_tags($str); //刪除<html>標記
          ?>

          輸出結果:

          webserver; & \ 'Linux' & Apache

          者 | 丁彥軍

          責編 | 仲培藝

          近日,有位粉絲向我請教,在爬取某網站時,網頁的源代碼出現了中文亂碼問題,本文就將與大家一起總結下關于網絡爬蟲的亂碼處理。注意,這里不僅是中文亂碼,還包括一些如日文、韓文 、俄文、藏文之類的亂碼處理,因為他們的解決方式是一致的,故在此統一說明。

          亂碼問題的出現

          就以爬取 51job 網站舉例,講講為何會出現“亂碼”問題,如何解決它以及其背后的機制。

          代碼示例:

          import requests
          url="http://search.51job.com"
          res=requests.get(url)
          print(res.text)
          

          顯示結果:

          打印 res.text 時,發現了什么?中文亂碼?。?!不過發現,網頁的字符集類型采用的是 GBK 編碼格式。

          我們知道 Requests 會基于 HTTP 頭部對響應的編碼作出有根據的推測。當你訪問 r.text 之時,Requests 會使用其推測的文本編碼。你可以找出 Requests 使用了什么編碼,并且能夠使用 r.encoding 屬性來改變它。

          接下來,我們一起通過 Resquests 的一些用法,來看看 Requests 會基于 HTTP 頭部對響應的編碼方式。

          print(res.encoding) #查看網頁返回的字符集類型
          print(res.apparent_encoding) #自動判斷字符集類型
          

          輸出結果為:

          可以發現 Requests 推測的文本編碼(也就是網頁返回即爬取下來后的編碼轉換)與源網頁編碼不一致,由此可知其正是導致亂碼原因。

          亂碼背后的奧秘

          當源網頁編碼和爬取下來后的編碼轉換不一致時,如源網頁為 GBK 編碼的字節流,而我們抓取下后程序直接使用 UTF-8 進行編碼并輸出到存儲文件中,這必然會引起亂碼,即當源網頁編碼和抓取下來后程序直接使用處理編碼一致時,則不會出現亂碼,此時再進行統一的字符編碼也就不會出現亂碼了。最終爬取的所有網頁無論何種編碼格式,都轉化為 UTF-8 格式進行存儲。

          注意:區分源網編碼 A-GBK、程序直接使用的編碼 B-ISO-8859-1、統一轉換字符的編碼 C-UTF-8。

          在此,我們拓展講講 Unicode、ISO-8859-1、GBK2312、GBK、UTF-8 等之間的區別聯系,大概如下:

          最早的編碼是 ISO8859-1,和 ASCII 編碼相似。但為了方便表示各種各樣的語言,逐漸出現了很多標準編碼。ISO8859-1 屬于單字節編碼,最多能表示的字符范圍是 0-255,應用于英文系列。很明顯,ISO8859-1 編碼表示的字符范圍很窄,無法表示中文字符。

          1981 年中國人民通過對 ASCII 編碼的中文擴充改造,產生了 GB2312 編碼,可以表示 6000 多個常用漢字。但漢字實在是太多了,包括繁體和各種字符,于是產生了 GBK 編碼,它包括了 GB2312 中的編碼,同時擴充了很多。中國又是個多民族國家,各個民族幾乎都有自己獨立的語言系統,為了表示那些字符,繼續把 GBK 編碼擴充為 GB18030 編碼。每個國家都像中國一樣,把自己的語言編碼,于是出現了各種各樣的編碼,如果你不安裝相應的編碼,就無法解釋相應編碼想表達的內容。終于,有個叫 ISO 的組織看不下去了。他們一起創造了一種編碼 Unicode,這種編碼非常大,大到可以容納世界上任何一個文字和標志。所以只要電腦上有 Unicode 這種編碼系統,無論是全球哪種文字,只需要保存文件的時候,保存成 Unicode 編碼就可以被其他電腦正常解釋。Unicode 在網絡傳輸中,出現了兩個標準 UTF-8 和 UTF-16,分別每次傳輸 8 個位和 16 個位。于是就會有人產生疑問,UTF-8 既然能保存那么多文字、符號,為什么國內還有這么多使用 GBK 等編碼的人?因為 UTF-8 等編碼體積比較大,占電腦空間比較多,如果面向的使用人群絕大部分都是中國人,用 GBK 等編碼也可以。

          也可以這樣來理解:字符串是由字符構成,字符在計算機硬件中通過二進制形式存儲,這種二進制形式就是編碼。如果直接使用 “字符串??字符??二進制表示(編碼)” ,會增加不同類型編碼之間轉換的復雜性。所以引入了一個抽象層,“字符串??字符??與存儲無關的表示??二進制表示(編碼)” ,這樣,可以用一種與存儲無關的形式表示字符,不同的編碼之間轉換時可以先轉換到這個抽象層,然后再轉換為其他編碼形式。在這里,Unicode 就是 “與存儲無關的表示”,UTF-8 就是 “二進制表示”。

          亂碼的解決方法

          根據原因來找解決方法,就非常簡單了。

          方法一:直接指定 res.encoding

          import requests
          url="http://search.51job.com"
          res=requests.get(url)
          res.encoding="gbk"
          html=res.text
          print(html)
          

          方法二:通過 res.apparent_encoding 屬性指定

          import requests
          url="http://search.51job.com"
          res=requests.get(url)
          res.encoding=res.apparent_encoding
          html=res.text
          print(html)
          

          方法三:通過編碼、解碼的方式

          import requests
          url="http://search.51job.com"
          res=requests.get(url)
          html=res.text.encode('iso-8859-1').decode('gbk')
          print(html)
          

          輸出結果:

          基本思路三步走:確定源網頁的編碼 A---GBK、程序通過編碼 B---ISO-8859-1 對源網頁數據還原、統一轉換字符的編碼 C-UTF-8。至于為啥出現統一轉碼這一步呢? 網絡爬蟲系統數據來源很多,不可能使用數據時,再轉化為其原始的數據,這樣做是很廢事的。所以一般的爬蟲系統都要對抓取下來的結果進行統一編碼,從而在使用時做到一致對外,方便使用。

          比如如果我們想講網頁數據保存下來,則會將起轉為 UTF-8,代碼如下:

          with open("a.txt",'w',encoding='utf-8') as f:
           f.write(html)
          

          總結

          關于網絡爬蟲亂碼問題,這里不僅給出了一個解決方案,還深入到其中的原理,由此問題引申出很多有意思的問題,如 UTF-8、GBK、GB2312 的編碼方式怎樣的?為什么這樣轉化就可以解決問題?

          最后,多動腦,多思考,多總結,致每一位碼農!

          本文為作者投稿,版權歸其所有。


          主站蜘蛛池模板: 国产精品一区二区久久精品无码 | 日韩亚洲一区二区三区| 精彩视频一区二区| 午夜AV内射一区二区三区红桃视| 日韩好片一区二区在线看| 国产精品一区二区久久| 色欲AV无码一区二区三区| 免费观看一区二区三区| 亚洲一区二区三区在线观看网站| 久久国产精品一区| 色精品一区二区三区| 无码人妻啪啪一区二区| 国产亚洲一区二区精品| 国产一区中文字幕在线观看| 亚洲av不卡一区二区三区| 精品无码综合一区| 波多野结衣中文一区二区免费| 亚洲一区二区中文| 亚洲av高清在线观看一区二区 | 久久伊人精品一区二区三区| 亚洲一区精品无码| 91久久精一区二区三区大全| 日本一区二区三区中文字幕 | 香蕉久久ac一区二区三区| 亚洲一区二区三区久久久久| 久久精品一区二区三区四区| 红桃AV一区二区三区在线无码AV | 一区二区三区在线看| 国内精品一区二区三区最新| 精品国产一区二区麻豆| 香蕉久久ac一区二区三区| 国产精品熟女视频一区二区| 国产嫖妓一区二区三区无码 | 国产成人精品一区二区三区免费 | 国产一区在线视频| 亚洲av鲁丝一区二区三区| 人妻激情偷乱视频一区二区三区| 精品一区二区三区四区在线播放| 亚洲综合一区二区| 国产激情一区二区三区 | 国产亚洲一区二区精品|