小编eil*_*rra的帖子

php中的UTF-8问题:var_export()返回\ 0 null字符,而ucfirst(),strtoupper()等表现得很奇怪

我们正在处理一个以前从未发生过的Joyent Solaris服务器中的奇怪错误(不会发生在localhost或其他两个具有相同php配置的Solaris服务器上).实际上,我不确定我们是否必须查看php或solaris,以及它是否是软件或硬件问题......

我只是想发布这个,以防有人指出我们正确的方向.

所以,问题似乎是在var_export()处理奇怪的角色时.在CLI中执行此操作,我们在localhost机器和两个服务器中获得预期结果,但不在第三个服务器中获得.所有这些都配置为使用utf-8.

$ php -r "echo var_export('ñu', true);"
Run Code Online (Sandbox Code Playgroud)

在旧服务器和localhost (预期)中给出:

'ñu'
Run Code Online (Sandbox Code Playgroud)

但是在服务器中我们遇到了问题(PHP版本=> 5.3.6),\0每当遇到"不常见"的字符时它会添加空字符:è,á,ç,......你给它命名.

'' . "\0" . '' . "\0" . 'u'
Run Code Online (Sandbox Code Playgroud)

关于应该在哪里看的任何想法?提前致谢.


更多信息:

  • PHP version 5.3.6.
  • setlocale() 没有解决任何问题.
  • default_charsetUTF-8php.ini.
  • mbstring.internal_encoding被设置为UTF-8php.ini.
  • mbstring.func_overload = 0.
  • 这在CLI(示例)和Web应用程序(php-fpm + nginx)中都会发生.
  • iconv 编码也是 UTF-8
  • 所有文件utf-8编码.

system('locale') 收益:

LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_ALL=
Run Code Online (Sandbox Code Playgroud)

到目前为止完成的一些测试(CLI):

正常行为:

$ php …
Run Code Online (Sandbox Code Playgroud)

php localization utf-8 joyent

9
推荐指数
2
解决办法
2588
查看次数

在Django中测试请求参数("+"表现不同)

我有一个Django View,它使用查询参数进行一些内容过滤.像这样的东西:

/page/?filter=one+and+two
/page/?filter=one,or,two
Run Code Online (Sandbox Code Playgroud)

我注意到Django将其转换+为空格(request.GET.get('filter')返回one and two),我就可以了.我只需要相应地调整split()我在View中使用的功能.

但...

当我尝试测试此视图时,我打电话给:

from django.test import Client
client = Client()
client.get('/page/', {'filter': 'one+and+two'})
Run Code Online (Sandbox Code Playgroud)

request.GET.get('filter')返回one+and+two:加号,没有空格.为什么是这样?

我想认为这Client().get()模仿了浏览器的行为,所以我想了解的是为什么调用client.get('/page/', {'filter': 'one+and+two'})不像浏览/page/?filter=one+and+two.出于测试目的,它在我看来应该是相同的,并且在两种情况下,视图应该为过滤器接收一致的值:be with with +或with space.

我没有得到的是为什么有两种不同的行为.

python django

7
推荐指数
1
解决办法
4505
查看次数

如何配置Apache在同一个域中有两个symfony项目(不使用子域)?

我正在尝试将Apache配置为在同一个域下拥有不同的symfony项目(每个项目都有自己的框架安装),但我无法使用文件夹来使用它.

这就是我想要的:

  • mydomain.com/projectone/
  • mydomain.com/projecttwo/

我可以使用子域工作,但不是我的首选解决方案,因为我最终有疯狂的子域名,如:

  • projectone.mydomain.com
  • backend.projectone.mydomain.com
  • projecttwo.mydomain.com
  • backend.projecttwo.mydomain.com

我在Apache中使用此配置使其适用于子域:

<VirtualHost 127.0.0.1:8080>
  ServerName projectone.mydomain.com
  DocumentRoot "/home/projectone/web"
  DirectoryIndex frontend.php
  <Directory "/home/projectone/web">
    Options -Indexes IncludesNOEXEC FollowSymLinks -MultiViews
    AllowOverride None
    Allow from All

    RewriteEngine On
    # we check if the .html version is here (caching)
    RewriteRule ^$ index.html [QSA]
    RewriteRule ^([^.]+)$ $1.html [QSA]
    RewriteCond %{REQUEST_FILENAME} !-f
    # no, so we redirect to our front web controller
    RewriteRule ^(.*)$ frontend.php [QSA,L]
  </Directory>

  Alias /sf /home/projectone/lib/vendor/symfony/data/web/sf
  <Directory "/home/projectone/lib/vendor/symfony/data/web/sf">
    AllowOverride All
    Allow from All …
Run Code Online (Sandbox Code Playgroud)

apache symfony1 virtualhost

6
推荐指数
1
解决办法
3146
查看次数

在Doctrine 2(和Symfony)中正确使用$ unitOfWork-> getScheduledCollectionDeletions()是什么?

我正试图检测onFlush事件中多对多关系的变化.

如果将新实体添加到关系中或更新关系(始终保持元素),我可以使用$unitOfWork->getScheduledCollectionUpdates()然后检查getInsertDiff()或检测更改getDeleteDiff().到现在为止还挺好.

当我从关系中取出所有实体时出现问题:"之前有两个相关实体,但现在没有相关实体."

当关系为空时我可以访问$unitOfWork->getScheduledCollectionDeletions(),但无法知道删除了哪些实体:

  • getDeleteDiff() 这个系列没有任何说明.
  • getSnapshot() 并没有告诉我之前有哪些实体

我怎么知道哪些实体被从多对多关系中取出?


我添加了一个完整实现的Gist:一切正常(可能需要一些优化),除了$uow->getScheduledCollectionDeletions()(第101行)

https://gist.github.com/eillarra/5127606

doctrine symfony doctrine-orm

4
推荐指数
1
解决办法
3583
查看次数