我有一段PHP代码,是在Windows 7机器上用notepad++写的
notepad++中的Encoding设置为"Encode to ANSI" (ASCII)
我在我的代码中这样做:
utf8_encode(£)
所以我肯定会得到utf友好版本的£符号。
在本地服务器上一切正常。
但是当我把它推送到我的实时服务器时,我得到了php中utf8编码错误的各种问题。
是git的push/pull过程中有什么东西破坏了这个,还是它可能是实时服务器上的区域设置?
本地和实时服务器都运行ubuntu 12.04
感谢更新1
实际得到的错误是
invalid byte sequence for encoding "UTF8": 0xa3'
(这是一个Postgres SQL错误)
local和live的另一个区别是live是https, local是http (apache)
更新2
运行:file -bi script.php
本地和现场生产:
text/x-php; charset=iso-8859-1
所以看起来好像文件的编码是完整的?
更新3
查看本地Postgres安装,它有以下设置:
ENCODING = 'UTF8'
LC_COLLATE = 'en_GB.UTF-8'
LC_CTYPE = 'en_GB.UTF-8'
而live有:
ENCODING = 'UTF8'
LC_COLLATE = 'en_US.UTF-8'
LC_CTYPE = 'en_US.UTF-8'
我将看看是否可以交换排序类型以匹配本地并看看是否有帮助
更新4我这样做,这是最终导致失败的代码段在现场(不是本地)
setlocale(LC_MONETARY, 'en_GB');
$equivFinal = utf8_encode("£") . money_format('%.2n', $equivFinal);
更新5 我越来越接近这个问题了。
在本地生成字符串
£1.00
在live状态下,字符串产生为
£�1.00
所以由于某些原因,实时服务器在进行UTF8转换时添加了更多的垃圾
更新6我把它固定在这里:
setlocale(LC_MONETARY, 'en_GB');
Logger::getInstance(__NAMESPACE__)->info("TEST 01= " .money_format('%.2n', 1.00));
在本地输出
TEST 01= 1.00
像预期的那样on live it output
TEST 01= �1.00
与随机字符添加到开始,这是什么导致我的utf8问题,因为它在那吱吱作响。
知道为什么money_format会在一个服务器上这样做而不是在另一个服务器上吗?
终于搞定了
的函数
如果你没有指定语言环境或者指定的不正确那么它就会做自己的事情
所以我在做
setlocale(LC_MONETARY, 'en_GB');
在本地意味着money_format忽略了从输出
开始的£但是在实际情况下,它意味着money_format将unicode WTF字符。
为ubuntu做正确的
setlocale(LC_MONETARY, 'en_GB.UTF-8');
表示money_format在前面有£,因此我不需要我的utf8垃圾
更新1
更好的是,不要使用setlocale我要这样做:
utf8_encode("£") . money_format('%!.2n', $equivFinal);
基本上是格式化货币并排除符号前缀
然后最好还是使用number_format和do
utf8_encode("£") . number_format($equivFinal, 2);
我学到了一些新东西
问题是你不能在ASCII文件中保存原始英镑符号。
永远不要在源代码中使用奇怪的字符,因为无论它们"应该"工作多少,您总是会遇到这样的问题。(你可以对"奇怪"有自己的定义,但我的定义是任何你不能在英美键盘上输入而不求助于alt-codes的东西。)
要绕过此限制,请将chr()函数的结果连接起来。(使用下面的代码片段查找需要传递的参数,在本例中CHR为163)
<?php echo(ord('£')); ?>
所以在你的例子中,这行应该是:
$equivFinal = chr(163) . money_format('%.2n', $equivFinal);