前幾天對接某第三方支付的時候發生了2個鬼問題,都是些坑 關於 編碼 和 時區 的問題
伺服器時區導致的問題
第一個問題就是 請求對方的 下單 介面 一直返回 下單超時 的錯誤資訊
找了好久最後發現是測試伺服器的時區不對 是 UTC 而對方是東八區的 CST 整整晚了別人8個小時 下單不超時都怪了
UTC
UTC (Universal Time Coordinated) 世界協調時 又稱 世界標準時間
是最主要的世界時間標準,其以原子時秒長為基礎,在時刻上儘量接近於格林尼治標準時間
協調世界時是世界上調節時鐘和時間的主要時間標準,它與0度經線的平太陽時相差不超過1秒[4],並不遵守夏令時。
協調世界時是最接近格林威治標準時間(GMT)的幾個替代時間系統之一。
對於大多數用途來說,UTC時間被認為能與GMT時間互換,但GMT時間已不再被科學界所確定
*這套時間系統被應用於許多網際網路和全球資訊網的標準中 例如,網路時間協議(NTP, Network Time Protocol)就是協調世界時在網際網路中使用的一種方式 *
表示形式:
如果本地時間比UTC時間快
例如中國大陸[注 1]、香港、澳門、臺灣、蒙古國、新加坡、馬來西亞、澳大利亞西部的時間比UTC快8小時 就會寫作
UTC+8
,俗稱 東八區。
相反,如果本地時間比UTC時間慢,例如夏威夷的時間比UTC時間慢10小時,就會寫作
UTC-10
,俗稱西十區
CST
CST的話 可以代表 4個 不同的時區
大中華地區時區,China Standard Time
澳洲中部時間,Central Standard Time (Australia)
北美中部時區,Central Standard Time (North America)
古巴標準時間,Cuba Standard Time,參見北美東部時區
這些都可以記作 CST
講下中國 因幅員遼闊,依地理事實上可劃分為東五區、東六區、東七區、東八區、東九區等5個時區。
中華民國大陸時期依據國際標準,將全國時區劃分為崑崙時區、回藏時區(後改稱新藏時區)、隴蜀時區、中原時區、以及長白時區。
1949年中華人民共和國成立後,改將中國大陸全境統一劃為東八區(UTC+8),同時採用北京時間做為全國唯一的標準時間
所以我們現在都是已北京時間做為標準
中國屬於東八區 比 標準時間 UTC 塊了8個小時 所以 UTC+8
編碼方式導致的問題
第二個問題 支付成功非同步通知中的驗籤老是錯誤
各種排查沒找到問題 也是鬱悶了好久 最後看了下日誌
發現其中有個訂單描述的欄位 我傳遞過去的時候其中有中文描述 現在記錄到日誌裡出現了亂碼
最後請求對方協助 對方傳送的還真是 GBK
編碼 在我本地 UTF-8
變成了亂碼 導致驗籤一直失敗
mb_convert_encoding(urldecode($params['chinese']), 'utf-8', 'gb2312');
然後轉換了個編碼過驗籤透過了 至此 問題解決!
補了下編碼的知識 感覺又要掉進去海里去了 非常多的內容
ASCII碼
ASCII碼是美國定義的一套用於 英語字元 和 二進位制位 之間的關係的一種標準 包含了 128個字元
Unicode碼
一開始的編碼是很亂的 每個國家都有自己的編碼形式 後來為了統一 出現了 Unicode 編碼 他是一個很大的集合 包含了 所有的字元編碼
更多的可以看這裡www.unicode.org/
UTF-8編碼
UTF-8 是 Unicode 編碼 的實現方式之一
它是一種變長的編碼方式。它可以使用1~4個位元組表示一個符號,根據不同的符號而變化位元組長度
GBK編碼
GBK是國家標準GB2312基礎上擴容後相容GB2312的標準。
GBK的文字編碼是用雙位元組來表示的,即不論中、英文字元均使用雙位元組來表示,為了區分中文,將其最高位都設定成1。
GBK包含全部中文字元,是國家編碼,通用性比UTF8差
編碼之間的轉換
各編碼中間的轉換基本都是 透過 Unicode 編碼才能相互轉換
內容好多 我自己也看的有點迷糊了!!!
本作品採用《CC 協議》,轉載必須註明作者和本文連結