2

Windows 7 マシンの notepad++ で書かれた PHP コードがあります。

notepad ++のエンコーディングは「ANSIにエンコード」(ASCII)に設定されています

私は彼らが私のコードでこれをやっています:

utf8_encode("£")

そのため、必ず utf フレンドリー バージョンの £ 記号を取得します。

すべてがローカルサーバー上で完全に正常に動作します。

しかし、ライブサーバーにプッシュすると、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

予想通り

ライブで出力

 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

ソース コードで奇妙な文字を使用しないでください。それらがどれだけ機能するはずであっても、常にこのような問題に遭遇するからです。(「奇妙な」の独自の定義を考え出すことができますが、私の定義は、代替コードに頼らなければ英語のキーボードで入力できないものです。)

この制限を回避するには、chr() 関数の結果を連結します。(次のコード スニピットを使用して、chr に渡す必要があるパラメーターを確認します。この場合は 163 です。)

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

したがって、あなたの場合、行は次のようになります。

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