好的,在我的商务平台上,购物车数据在会话中存储为序列化数组。今天出现了一个问题,其中一个项目的尺寸选项具有1/4和1/2尺寸的特殊字符,例如; 7¼,7½等,但是当查看客户为此商品下的订单时,尺寸值显示如下:7½
Troublshooting 101,我带到了网站,并下了客户所放置的完全相同的订单......奇怪的是,一切都按预期工作,问题没有复制。然后我注意到订单是通过“电话订单”放置的,这是一个后端脚本,允许商店员工编辑新订单并在一个屏幕上充电/最终完成。系统通过使用jquery和ajax来实现这一点,以保持屏幕上的所有内容,而无需多个“结帐页面”。
无论如何,在电话订单脚本上放置相同的订单,问题再现就好了。深入研究一下,我注意到在客户下订单的“站点”一侧,使用PHP函数对购物车数据进行序列化,然后使用订单进行base64_encoded并将“COMPRESSED”存储在数据库中。
在电话订单方面,序列化是通过php.js序列化函数完成的,该函数假设同样模拟php序列化函数。然后将序列化数据与客户信息等一起发送给处理程序.CC收费,订单保存到数据库,就像在站点一样。
进一步研究,我将两侧的两个“序列化”字符串进行了比较,但是存在差异。在php方面,值7½显示为“s:2:7½”,Javascript版本显示为“s:3:7½”......
我已经在此过程中涉及的所有网页上验证了我网站的字符编码是西方(iso-8859-1)。
我能够解决这个问题...一旦将“坏”序列化对象传递给php以保存命令,然后我将其反序列化,然后将生成的数组/对象传递给运行a的递归函数转换器函数(char2html)对每个值,它将任何特殊字符转换为其实体名称代码,基本上½变为& frac12;并成为& Acirc;。然后我使用str_replace去掉任何“& Acirc;”字符串,然后通过我的另一个函数(html2char)运行它,它转换任何& entityNames;回到他们的实际时刻。
一旦该函数运行完成后,对象/数组将使用php的序列化函数重新序列化,一切运行正常,不再有Acric字符显示电话订单脚本上的订单。
所以我特意想弄清楚是否有某种方法可以强制将javascript中的½字符的UTF8版本转换为1字节版本(而不是javascript看到的两个字节的UTF8版本),之前我将它传递给serialize函数,希望serialize函数返回正确的字符串,不存在UTF8字符。
也有人说php.js序列化函数中有一些UTF8正在进行,但我的JS编码还不够先进,以确定是否有 INSIDE 序列化函数在做什么这......或者如果有的话如何改变它。
功能参考: http://phpjs.org/functions/serialize:508
思想?