遇到的編碼問題、時區問題整理

reggie發表於2021-08-10

前幾天對接某第三方支付的時候發生了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-8Unicode 編碼 的實現方式之一

它是一種變長的編碼方式。它可以使用1~4個位元組表示一個符號,根據不同的符號而變化位元組長度

GBK編碼

GBK是國家標準GB2312基礎上擴容後相容GB2312的標準。

GBK的文字編碼是用雙位元組來表示的,即不論中、英文字元均使用雙位元組來表示,為了區分中文,將其最高位都設定成1。

GBK包含全部中文字元,是國家編碼,通用性比UTF8差

編碼之間的轉換

各編碼中間的轉換基本都是 透過 Unicode 編碼才能相互轉換

內容好多 我自己也看的有點迷糊了!!!

本作品採用《CC 協議》,轉載必須註明作者和本文連結
微信公眾號:碼咚沒 ( ID: codingdongmei )

相關文章