網頁 php指令碼的編碼問題

2022-07-18 06:12:13 字數 2248 閱讀 5765

對於程式的編碼問題,做一次總結,我們清楚,從物件來說,編碼可能涉及到三到四個物件

一、首先是請求終端:

這個請求終端有可能是瀏覽器端,從瀏覽器端發起網頁請求;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編碼儲存  

<?php

if(isset($_request['m']))

$pram2 = "你好";

$filename = "";

$s = file_get_contents($filename

);

var_dump($s);

指令碼2 example.php 採用utf-8儲存只是輸出值

<?php

if(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...