web開發中我們一般都會不可避免的使用js。我們可以將js代碼直接放在頁面中即通過內部使用js。但是為了給頁面良好的"瘦身"我們一般都會將js代碼放在外部,然后通過src引用。這個時候我們就需要注意一個問題:編碼問題。如果web頁面也js采用不同編碼,這個時候就會出現亂碼。(內部使用js不需要注意編碼問題,因為他們采用的是同一種編碼)
對于大多數的web頁面,我們一般都是使用如下兩種編碼:UTF-8、GB2312。所以我們只需要同意頁面和js編碼就可以解決亂碼問題:
對于GBK頁面引用編碼為UTF-8編碼的JavaScript文件如果出現亂碼問題,可以使用下面的代碼來解決
復制代碼 代碼如下:
<script type=”text/javascript” src=”test.js” charset=”utf-8″></script>
同樣在UTF-8頁面中引入編碼為GBK的JavaScript文件亂碼問題了,可以使用如下方式:
復制代碼 代碼如下:
<script type=”text/javascript” src=”test.js” charset=”gb2312″></script>
此方法是對于在js文件中出現漢字中文,以及其他容易造成在GBK與UTF-8編碼錯誤字符的時候使用,對于純英文的就不需要了。如果為了保險,加上也可以....
假設需要劫持http響應并在html頁面中注入一段js代碼后再傳回瀏覽器,實現在瀏覽器出現一個彈框消息提醒。
由于原始html頁面編碼格式存在UTF-8、GBK等多種編碼格式,如果注入的js包含中文消息的話,那么在UTF-8或GBK編碼的頁面就會有一個出現亂碼。有沒有辦法做到不管是針對GBK、UTF-8編碼的頁面都能做到正常顯示而不會出現亂碼哪?
首先來分析一下產生亂碼的原因,我們在瀏覽器看到的信息都是通過圖形學手段在顯示器上呈現出來的,而實際保存在計算機硬件上的都是0和1(因為計算機實現是基于二進制),那么計算機要顯示、傳遞信息就需要依靠一套規則把一串串的0和1識別為正確的字符,這就是編碼。
例如01000001在ASCII編碼規則下對應字母A。相同的0/1串,不同的編碼解析出的字符一般是不同的,因此如果html頁面按照UTF-8的編碼解析正常,那么按照GBK的編碼解析就會是亂碼了。根據上面的示意圖,假設注入的js代碼為utf-8編碼格式,而原始html編碼格式也為UTF-8編碼格式,那么最終注入這部分中的中文就能正常顯示,但是如果原始html為GBK編碼,那注入的這部分js代碼的中文就會顯示亂碼。
有一種unicode統一編碼字符集,目標是把所有文字、字符統一編碼,也就是一串0/1組合在unicode字符集下對應的字符是唯一的,不會存在歧義。而js是支持解析unicode字符的,那么就可以在注入js中把要顯示的消息統一轉換為unicode編碼,瀏覽器端去解析這個unicode編碼,這樣不管原始html是UTF-8還是GBK,都能正常顯示中文。
原始注入js代碼關于中文字符的部分
// utf-8編碼格式
let message = "中文";
解決亂碼的注入js代碼關于中文字符的部分
// utf-8編碼格式
let message = "\\u4e2d\\u6587"; // 這個編碼對應上面的message"中文"
注意:
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
*請認真填寫需求信息,我們會在24小時內與您取得聯系。