5

ここ数日、PHPコードベースをlatin1からUTF-8に変換することに取り組んできました。2つの主な解決策は、シングルバイト関数を組み込みのマルチバイト関数に置き換えるか、php.iniファイルにmbstring.func_overload値を設定することです。

しかし、スタックオーバーフローでこのスレッドに出くわしました。ここで、thomasrutterによる投稿は、スクリプトと文字列リテラルがUTF-8でエンコードされている限り、マルチバイト関数はUTF-8には実際には必要ないことを示しているようです。

これが正しいかどうかについて他の証拠は見つかりませんでした。コードをmb_functionsに変換する必要がないことが判明した場合は、リアルタイムで節約できます。これに光を当てることができる人はいますか?

4

8 に答える 8

11

私が問題を理解している限り、すべてのデータが utf-8 で 100% である限り、つまり、ユーザー入力、データベース、および特殊文字が含まれている場合は PHP ファイル自体のエンコーディングも意味します。これは本当です。 検索および比較操作の場合は true。@ntd が指摘しているように、非マルチバイト strlen() は、マルチバイト文字を含む文字列に対して実行すると、間違った結果を生成します。

これは、エンコーディングの基本に関する素晴らしい記事です。

于 2009-11-16T20:02:35.847 に答える
4

それらが置き換える関数のいずれかを使用している場合 (およびこれらの関数の少なくとも 1 つを使用している可能性が高い)、またはHTTP 処理などの拡張機能が明示的に必要でない限り、それらは「必要」ではありません。

UTF-8 準拠に向けて作業するとき、私は常にPHP UTF-8 Cheatsheetuにフォールバックし、1 つ追加します。修飾子を使用するには、PCRE パターンを更新する必要があります。

于 2009-11-16T20:17:10.203 に答える
3

マルチバイト文字列を調べたり変更したりするとすぐに、mb_* 関数を使用する必要があります。理由を示す非常に簡単な例:

$str = "abcžđščćöçefg";
mb_internal_encoding("UTF-8");

echo "strlen: ".strlen($str)."\n";
echo "mb_strlen: ".mb_strlen($str)."\n";

これは出力します:

strlen: 20
mb_strlen: 13
于 2009-11-16T20:19:44.113 に答える
2

mb_strtoupper などの関数も必要になる場合があります。strtoupper は á を Á に変換しません。

于 2009-11-16T20:55:27.037 に答える
2

thomasrutter は、検索に特別な処理が必要ないことを示しています。たとえば、UTF8 文字列の長さを確認する必要がある場合、plain を使用してそれを行う方法がわかりませんstrlen()

于 2009-11-16T20:10:44.363 に答える
1

文字列が1バイトであることを期待する関数はたくさんあります(そして、iso-8859-1であると仮定する関数もあります)。このような場合は、自分が何をしているのかを認識し、場合によっては置換機能を使用する必要があります。http://www.phpwact.org/php/i18n/utf-8にかなり包括的なリストがあります。

于 2009-11-16T20:39:22.483 に答える
-1

この http://php.net/manual/en/mbstring.overload.php 設定を php.ini ファイルで使用できるため、コードを変更する必要はありません。

ただし、すべての文字列関数が自動的に変更されるわけではないため、注意してください。これは 1 つです: http://php.net/manual/en/function.substr-replace.php

于 2009-12-22T10:19:07.720 に答える