2

私はこれまで英語のみであったアプリケーションを持っています。テンプレートとデータベース全体のコンテンツエンコーディングはUTF-8です。私は現在、アプリケーションを国際化/翻訳して、UTF-8を絶対に必要とする文字セットを持つ言語に変換することを検討しています。

アプリケーションは、、、などのさまざまなPHP文字列関数を使用します。マルチバイト文字を正しく処理するには、これらを、、、strlen()などのマルチバイト文字列関数に切り替える必要があると理解しています。私はこのトピックを少し読んでみましたが、事実上、私が見つけることができるすべてのものが「エンコーディング理論」に深く入り込んでおり、質問に対する簡単な答えを提供していません。たとえば英語とアラビア語の両方で正常に動作することを使用して期待していますか、それとも私がまだ注意する必要がある何かがありますか?strpos()substr()mb_strlen()mb_strlen()mb_substr()strlen()mb_strlen()

どんな洞察も歓迎されます、そして私が私の相対的な無知で彼らの心の近くでエンコーディングをしている誰かを怒らせているならば、謝罪します。

4

3 に答える 3

3

いいえ。PHPではバイト配列も文字列であるため、8ビットの文字列関数を対応するmb_ *関数に置き換えるだけで、問題が発生するだけです。strlen()やsubstr()のような関数は、実際のテキスト文字列よりもバイトで頻繁に使用される可能性があります。

私が最後に働いた場所では、mbstringライブラリをまったく使用せずに、PHPで多言語のWebサイト(アラビア語、ヒンディー語など)を構築することができました。テキスト文字列の操作は、実際にはそれほど頻繁には発生しません。その場合、関数名を変更するよりもはるかに注意が必要です。私が見つけた課題のほとんどは、HTML側にあります。ページレイアウトをRTL言語で機能させることは、重要な部分です。

例としてアラビア語を使用しているだけかどうかはわかりません。国際化の難しさは、「国際」がヨーロッパ言語のみ(およびロシア語)を意味するのか、それとも中東、南アジア、および極東の言語を含むのかによって、かなり大きく異なります。

于 2012-08-20T22:42:47.110 に答える
1

php.iniのmbstring.func_overloadフラグのステータスを確認します

(ini_get('mbstring.func_overload')&2)の場合、strlen()のような関数(ここにリストされている)はすでにmb_strlen()関数によってオーバーロードされているため、mb_*関数を明示的に呼び出す必要はありません。

于 2012-08-20T22:15:55.757 に答える
1

実際に必要なマルチバイト関数の数は10未満なので、関数またはロジックの使用法が適切かどうかを3つまたは5つの質問で作成します。この質問は安全ではなく、答えるのが難しいです。小さな質問はすぐに答えを得ることができます。具体的な質問は良い答えを引き出すことができます。他の質問を作成するときに私に知らせてください。

ユースケースが必要な場合は、WordpressMediaWikiDrupalなどのCMSのフォールバック関数を参照してください。

mbstringの使用を開始する場合は、mbstring.func_overloadディレクティブの使用を避ける必要があります。Mbstringメンテナは、PHP 5.5または5.6でmbstring.func_overloadを非推奨にする予定です(2012年4月のP HPコアメーリングリストを参照)。mbstring.func_overloadは、mbstring.func_overloadの使用が予期されていないコードベースを破壊します。strlen()を使用してContent-Lengthを計算する際の、CakePHP、ZendFramework1xのケースを確認できます。

私は別の場所で同様の質問に答えました:mbstring関数を使用するためにすべてのフレームワークをリファクタリングする必要がありますか?

于 2012-12-05T16:38:18.837 に答える