2014-10-16 173 views
1

背景故事:我一直在尝试在Symfony2应用程序中实现DynamoDB会话句柄。PHP会话字符串包含奇怪的空白/空字符

当会话保存到DynamoDB时,我遇到了一个绊脚石。看起来,来自PHP的字符串是一些奇怪的编码,它包含不是空格的空白字符,这会阻止字符串正确保存在DynamoDB中。当我将它粘贴到PhpStorm时,该字符串也不会很好玩。

这里是它的一个样本: $illegalString = 's:8:"userData";O:27:"\SomeClass":49:{s:8:"�*�email";s:27:"[email protected]";s:13:"�*�first_name";s:4:"Greg";';

以供参考,在这里是从PhpStorm的屏幕截图显示,这不是空白。 PhpStorm Screen shot 另外,如果我试图四处移动我的光标放在这些字符,其他字符开始出现,下面我的光标在图像中第1行的几个空格,最后分号的左边,引号呢不存在于字符串中,但由于某种原因,当我的光标在其上时出现。 enter image description here

如果你复制/粘贴上面的字符串到下面的网站,它打破了页:http://www.asciivalue.com/index.php

三个问题:

  1. 什么不对这个字符串?它是什么样的时髦编码?
  2. 为什么PHP以这种方式处理会话字符串?
  3. 如何让PHP在创建会话字符串时仅使用UTF-8?

注意:这只出现在使用最新的Linux AMI的AWS ec2上。

回答

1

这些字符告诉你有一些问题与编码的地方(无论是从一个转换到另一个时(可能悄无声息)或指定错误的编码)。

你有那里的序列似乎是EF BF BD(正如我将它复制粘贴到UTF-8文档后看到的),它代表REPLACEMENT CHARACTER - 用于从一种编码转换时用于替换非法字符到另一个(或使用错误的编码验证/清理)。

例如:A0字符在ISO 8599-1中有效,但如果您错误地将字符串视为UTF-8编码,那么该字符在那里将无效,并将被上述顺序替换。


我建议检查你的会话数据之前它就会通过一个会话处理程序(特别是如果你使用自定义的一个)保存 - 也许就是这样写入会议之前。

同时检查session.serialize_handler你使用的是什么 - 特别是如果自定义的使用。

您也可以尝试编写自己的会话处理程序(将编码数据写入文件或其他任何内容的部分 - 这很容易) - 查看处理程序的数据类型:它是好还是“已损坏” 。

我自己没有使用过任何AWS服务,所以不能就此部分提供建议。