遇到的编码问题、时区问题整理

IT知识
335
0
0
2022-06-03

前几天对接某第三方支付的时候发生了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 编码才能相互转换

内容好多 我自己也看的有点迷糊了!!!