2

我有一段 PHP 代码,它是在 Windows 7 机器上用 notepad++ 编写的

notepad++ 中的编码设置为“编码为 ANSI”(ASCII)

我是他们在我的代码中这样做:

utf8_encode("£")

所以我肯定会得到英镑符号的 utf 友好版本。

在本地服务器上一切正常。

但是当我将它推送到我的实时服务器时,我在 php.ini 中遇到了各种 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'

而 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

在现场,字符串产生为

 £�1.00

因此,由于某种原因,实时服务器在进行 UTF8 转换时添加了更多废话

更新 6

好的,所以我将其固定为:

 setlocale(LC_MONETARY, 'en_GB');
 Logger::getInstance(__NAMESPACE__)->info("TEST 01= " .money_format('%.2n', 1.00));

在本地它输出

 TEST 01= 1.00

正如预期的那样

在现场输出

 TEST 01= �1.00

将随机字符添加到开头,这就是导致我的 utf8 问题的原因,因为它正在喋喋不休。

知道为什么money_format 会在一台服务器上而不是另一台服务器上这样做吗?

4

3 回答 3

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

我学到了一些新东西:)

于 2013-04-03T23:56:29.663 回答
0

问题是您无法将原始 GBP 符号保存在 ASCII 文件中。

于 2015-09-15T16:12:30.867 回答
-1

永远不要在你的源代码中使用奇怪的字符,因为无论它们“应该”如何工作,你总是会遇到这样的问题。(你可以想出你自己对“奇怪”的定义,但我的定义是你不能在不使用 alt 代码的情况下在美式英语键盘上输入的任何东西。)

为了绕过这个限制,在 chr() 函数的结果中连接。(在这种情况下,使用以下代码片段找出您需要传递 chr 的参数是 163。)

<?php echo(ord('£')); ?>

因此,在您的情况下,该行将显示为:

$equivFinal = chr(163) . money_format('%.2n', $equivFinal);
于 2013-04-03T23:29:38.163 回答