ASCII php文件中的GBP£符号在实时服务器上转换为££(使用git传输)

时间:2013-04-03 20:11:26

标签: php git utf-8 ascii

我有一段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会在一台服务器而不是另一台服务器上执行此操作?

3 个答案:

答案 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);