對於程式的編碼問題,做一次總結,我們清楚,從物件來說,編碼可能涉及到三到四個物件
一、首先是請求終端:
這個請求終端有可能是瀏覽器端,從瀏覽器端發起網頁請求;ajax請求;也有可能是程式內部的api呼叫。
a、先看瀏覽器端和web伺服器端的資料互動採用的編碼符合什麼準則
瀏覽器端的輸入分成兩種情況,
第一種情況是:在瀏覽器的位址列輸入url位址,在帶有漢字的情況下的編碼選擇,這種情況是沒有指定傳輸編碼,測試中發現,ie,firefox,chrome會將位址列中
瀏覽器
預設傳輸編碼
iegbk
firefox
utf-8
chrome
utf-8
第二種情況是:在網頁中輸入的漢字,再和伺服器互動過程中的編碼選擇
這種情況的漢字傳輸編碼,會和網頁設定的編碼有關。如果charset是gbk,則以gbk形式傳遞引數。
b、ajax請求
實際上ajax請求和第一種情況,從位址列輸入url發起請求一樣,實際上都是未指定請求引數的編碼,在這種情況下,
c、php程式內部的api請求
我們在php程式中會使用到curl或者簡單的使用file_get_contents()方法去呼叫api,在呼叫過程中,我們會帶上引數。如果這個引數是漢字
那麼出現兩種情況
情況一,引數是外界輸入
情況二,引數是指令碼定義的
我們寫個簡單的實驗看一下,首先,我們寫乙個指令碼testcode.php,採用gbk編碼儲存
<?phpif(isset($_request['m']))
$pram2 = "你好";
$filename = "";
$s = file_get_contents($filename
);
var_dump($s);
指令碼2 example.php 採用utf-8儲存只是輸出值
<?phpif(isset($_request['p1']))
else
if(isset($_request['p2']))
else
我們在瀏覽器端請求 達人
3、第三步,testcode.php指令碼被php引擎讀入,發現file_get_contents,需要請求鏈結,再發起請求到nginx伺服器。我們能看到 這個請求鏈結包含兩個引數 /test/example.php?p1=......&p2=.... ,很明顯,從指令碼看,p1這個引數是utf8編碼,p2這個引數是gbk編碼。
4、第四步,nginx請求處理file_get_contents請求,將請求轉給php-fpm
5、第五步,php引擎接到第四步的請求,讀入example.php指令碼處理,我們看一下,處理的返回值。返回的字串編碼是 e8be bee4 baba c4e3 bac3 明顯看出來,前面是三個位元組是utf8編碼,表示「達人」,後面兩個是gbk編碼表示「你好」
7、第七步、 testcode.php指令碼在處理完後,會將結果返回給nginx伺服器,返回處理值中,對於指令碼的返回值,做了gzip壓縮,這主要是因為在請求頭上有接受gzip壓縮(是否可以看出,請求頭上的是否接受壓縮,是php引擎做的?)
8、第八步、nginx伺服器和客戶端互動,在這裡,實際上返回值被gzip壓縮了。所以看不到傳遞的值,但是從客戶端解壓縮後,我們可以看到,顯示的結果和第7步返回給nginx的是一致的。
從上面的情況,我們大概能得到這樣的結論:
這個結論是建立在簡單的實驗基礎上,未參照php原始碼,可能會有不一致的地方,但是,不管怎麼樣,我們可以認為,
1、在php程式中,如果不採用轉碼函式,如,iconv()等,那麼php本身不會自動將輸入引數轉成**本省的引數
2、在php程式中,程式內部定義的漢字,按照程式儲存時候的編碼傳遞。
shell指令碼編碼問題
最近某個指令碼的執行經常導致編碼問題。指令碼從遠端mysql資料庫獲取影片中文名,然後再匯入本機的mysql中。發現由crontab自動執行的時候獲取的影片名稱都是亂碼,但手動執行指令碼卻正常輸出。幾天都是這個問題。今天突然想起以前也有類似問題,在終端執行 echo lang 然後在指令碼中加 ex...
Linux shell指令碼編碼問題
在linux中執行.sh指令碼,異常 bin sh m bad interpreter no such file or directory。分析 這是不同系統編碼格式引起的 在windows系統中編輯的.sh檔案可能有不可見字元,所以在linux系統下執行會報以上異常資訊。解決 1 在windows...
Ubuntu Shell指令碼編碼問題
今天一同事在寫乙個資料庫備份的shell指令碼,在多次確定指令碼 無誤的情況下,發現指令碼輸出的結果死活不正常。author jenkihuang email jenkihuang qq.com version 20150407 bin bash data dir home oracle bakup...