1

このトピックについていくつか読んだことがありますが、それでもコミュニティと共有したい疑問があります.

私が開発したアプリケーション DaDaBIK に完全な utf-8 サポートを追加したいと考えています。アプリケーションは、さまざまな DBMS (MySQL、PostgreSQL、SQLite など) で使用できます。データベースで使用される文字セットは ANY にすることができます。文字セットを設定または想定することはできません。

私のアプローチは、iconv 関数を使用して、db から utf-8 で読み取ったすべてを変換し、DB に書き込む必要があるときに元の文字セットに変換することです。これにより、utf-8 で作業していると仮定できます。

問題は、おそらくご存じのとおり、PHP がネイティブで utf-8 をサポートしていないことです。また、mbstring を使用すると仮定しても、( http://www.phpwact.org/php/i18n/utf-8によると)存在します。 PREG 拡張機能、strcspn、trim、ucfirst、ucwords など、utf-8 および DON で問題を引き起こす可能性のあるいくつかの PHP 関数には、mbstring 対応がありません。

adodb や htmLawed などの外部ライブラリを使用しているため、すべてのソース コードを制御することはできません...これらのライブラリでは、これらの関数を使用するケースがいくつかあります....何かアドバイスはありますか? そして何よりも、ワードプレスなどの非常に人気のあるアプリケーションは、この (IMHO 大きな) 問題をどのように処理していますか? 彼らがコードに「トリム」を持っていないとは思えません....彼らはリスクを冒しているだけですか(データの破損など)、それとも私が見ることができないものがありますか?

どうもありがとう。

4

1 に答える 1

2

まず第一に、PHPはUTF-8をネイティブで問題なくサポートしています。文字列を処理するコア関数の一部のみをマルチバイト文字列で使用しないでください。

それはあなたが話している機能とあなたがそれらを何のために使っているかに完全に依存します。PHP文字列は、エンコーディングのないバイト配列です。したがって、ほとんどの標準関数はrawバイトでのみ機能します。trim文字列の最初と最後で特定のバイトを探してそれらを削除します。UTF-8は完全にASCII互換であるため、UTF-8でエンコードされた文字列で完全に機能します。str_replace文字列内の文字(バイト)を検索し、それらを置換または削除する同様の関数についても同じことが言えます。

唯一の実際の問題は、のようなオフセットで機能する関数ですsubstr。デフォルトの関数はバイトオフセットで機能しますが、実際にはよりインテリジェントな文字オフセットが必要ですが、これは必ずしもバイトに対応しているとは限りません。これらの関数には、mb_通常、同等のものが存在します。

preg_/u修飾子を使用すると、UTF-8を問題なくサポートします。

たとえば、substr潜在的なマルチバイト文字列を使用するライブラリがある場合、それは悪いライブラリであるため、別のライブラリを使用します。

PHPと文字セットに関するより詳細な議論と謎解きについては、すべてのプログラマーがテキストを操作するためのエンコーディングと文字セットについて絶対に、積極的に知っておく必要があることを参照してください。

さらに、データベースのように文字列がエンコードされているかどうかは関係ありません。データベースの接続エンコーディングを設定できます。これにより、データベースはすべてを変換し、常に目的のクライアントエンコーディングでデータを返します。PHPですべてをアイコン化する必要はありません。

于 2012-09-05T11:47:05.560 に答える