2014-10-16 341 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服務,所以不能就此部分提供建議。