PHP会话字符串包含奇怪的空白/空字符

时间:2014-10-16 23:20:51

标签: php encoding amazon-dynamodb aws-php-sdk

背景故事:我一直在尝试在Symfony2应用程序中实现DynamoDB会话句柄。

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

以下是其中的一个示例: $illegalString = 's:8:"userData";O:27:"\SomeClass":49:{s:8:"�*�email";s:27:"me@domain.com";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?
  4. 注意:这似乎只发生在使用最新Linux AMI的AWS ec2上。

1 个答案:

答案 0 :(得分:1)

这些字符表示你在某处编码有问题(从一个编码转换到另一个编码时(可能是静默编码)或指定错误编码)。

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

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


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

还要检查您正在使用的session.serialize_handler - 特别是如果使用自定义的。

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

我自己没有使用任何AWS服务,因此无法就此部分提供建议。