我有一段PHP代码,用Windows 7机器上的notepad ++编写
记事本++中的编码设置为“编码为ANSI”(ASCII)
我是他们在我的代码中执行此操作:
函数utf8_encode( “£”)
所以我肯定会得到£符号的友好版本。
所有在本地服务器上运行完全正常。
但是当我把它推到我的实时服务器上时,我在php中遇到了各种各样的utf8编码错误问题。
git push / pull进程中的某些内容是否会破坏它,或者它可能是实时服务器上的区域设置?
本地和实时服务器都运行ubuntu 12.04
由于
更新1
我得到的实际错误是
invalid byte sequence for encoding "UTF8": 0xa3'
(这是Postgres SQL错误)
本地和现场的其他区别是现场是通过https而本地只是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'
而现场有:
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
在现场,字符串产生为
£�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会在一台服务器而不是另一台服务器上执行此操作?
答案 0 :(得分:0)
终于把它钉了
这是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并执行
utf8_encode("£") . number_format($equivFinal, 2);
我学到了新东西:)
答案 1 :(得分:0)
问题是您无法在ASCII文件中保存原始GBP符号。
答案 2 :(得分:-1)
永远不要在源代码中使用奇怪的字符,因为无论它们“应该”工作多少,你总会遇到这样的问题。 (你可以想出你自己的“怪异”定义,但我的是你不能在美英键盘上输入任何东西而不诉诸alt代码。)
要在chr()函数的结果中获得此约束条件。 (在这种情况下,使用以下代码片段来找出传递chr所需的参数是163。)
<?php echo(ord('£')); ?>
所以在你的情况下,该行将显示为:
$equivFinal = chr(163) . money_format('%.2n', $equivFinal);