1

背景故事:我一直在尝试在我的 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 屏幕截图 此外,如果我尝试在这些字符上移动光标,其他字符开始出现,在我的光标下方的图像中,第 1 行最后一个分号左侧的几个空格,引号不存在字符串,但由于某种原因,当我的光标在它上面时它会出现。 在此处输入图像描述

如果您将上面的字符串复制/粘贴到下面的站点中,它会破坏页面:http ://www.asciivalue.com/index.php

三个问题:

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

注意:这似乎只在使用最新 Linux AMI 的 AWS ec2 上发生。

4

1 回答 1

1

这些字符告诉您在某处编码有问题(从一种转换到另一种时(可能是无声的)或指定错误的编码)。

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

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


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

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

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

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

于 2014-10-17T00:58:30.257 回答