php

【PHP】マルチバイト文字をバイト数で切り出し文字化け対応

phpでマルチバイト文字列をバイト数で切り出す場合は、mb_strcut()を使用する。
substr()だと文字化けすることがある。
「あ」が3byteだとすると、1byte目や2byte目までで切り出した場合に文字化けする。

文字化けするパターン

例)文字コードutf8の場合

$a = 'aaあああ';
var_dump(mb_strcut($a, 0, 3)); //出力内容:aa
var_dump(mb_strcut($a, 0, 4)); //出力内容:aa
var_dump(mb_strcut($a, 0, 5)); //出力内容:aaあ

$a = 'aaあああ';
var_dump(substr($a, 0, 3)); //出力内容:aa�
var_dump(substr($a, 0, 4)); //出力内容:aa��
var_dump(substr($a, 0, 5)); //出力内容:aaあ

mb_strcutについて

(PHP 4 >= 4.0.6, PHP 5)
mb_strcut — 文字列の一部を得る

string mb_strcut ( string $str , int $start [, int $length = NULL [, string $encoding = mb_internal_encoding() ]] )

パラメータ
str
取り出しの対象となる文字列。
start
start が非負である場合に返される文字列は、 string の start バイト目以降の文字列となります (ゼロから数えます)。 たとえば、文字列 ‘abcdef’ の 0 バイト目は ‘a’ で、 2 バイト目は ‘c’ のようになります。

start が負の数の場合に返される文字列は、 string の後ろから数えて start バイト目以降となります。

length
バイト単位での長さ。 省略したり NULL を指定したりした場合は、 文字列の最後までの全バイトを取り出します。
encoding
encoding パラメータには文字エンコーディングを指定します。省略した場合は、 内部文字エンコーディングを使用します。
返り値
mb_strcut() は、 start および length パラメータで指定した str の一部を返します。

phpのstr_replace文字化けについて

phpの関数「str_replace」
検索文字列に一致したすべての文字列を置換する関数です。

str_replaceマニュアル

スペースを置換しようと思ってstr_replaceを使って置換してたのですが、なんと文字化けするパターンがありました。
「ァ」などの全角小文字があると置換した際に文字化けしてしまいます。
原因と対処法をメモ。

原因

str_replaceはマルチバイト対応していない模様
「ァ」があるとコードにした際に、途中で違う文字と判定されるため

対処法

str_replaceではなく、mb_ereg_replaceを使用する
mb_ereg_replaceはマルチバイト対応関数

mb_ereg_replaceマニュアル

日本語が含まれる文字列を変換する際は、気をつけましょう!

PHP7が2015年11月にリリース予定

以下は2015.07.02の記事です。
一度消えてしまったので、日付が変わってしまっています。

パフォーマンスが向上しているPHP7

2015年11月リリース予定のPHP7。もうすぐでリリースです。
PHP5からPHP7へのバージョンアップで、PHP6が出なかったのはURF-16の実装が厳しくなったためのようです。

PHP5からだいぶ期間をおいてのバージョンアップになりますが、パフォーマンスが向上している模様。
PHPは遅いと言われていますが、PHP7はPHP5の2倍近くの速度で、Facebookが出しているHHVMと同等くらいとのこと。

これは期待しちゃいます。
最近はPHPの新規案件が減ってきたように思うので、これで状況が変わるかもしれませんね。
エンジニアの方は今後の動向に要注意!

PHP7の新機能

EngineExceptionという新しい致命的エラーの例外が出来た
 例)$hoge = $arr[‘abc’] ?? ‘デフォルト’;
   $arr[‘abc’]がnullでなければ$arr[‘abc’]を、nullであれば’デフォルト’を返す。
   未定義の場合にも有効なので、issetする必要なし。
関数の返却値に型を指定できる
新しい演算子「??」誕生。nullでなければ比較した値を、nullであれば、初期値を返却
新しい演算子「<=>」誕生。2つの値を比較し、等しい場合:0、左が大きい:正の値、右が大きい:負の値を返却
無名関数をその場で呼び出せる
名前空間のuseをまとめて複数書ける
除算の新関数「indiv」誕生(https://wiki.php.net/rfc/intdiv
 あまりではなく整数部分の取得が出来る
などなど

rfc(英語)
https://wiki.php.net/rfc

PHP7をリリース前に使いたい方

gitからソースを取得して使用する
参考:Qiita(http://qiita.com/pemopemo/items/9e0170251d45ed1b8818

2016/10/07 追記
だいぶ速度向上しているようです、PHP7!
変数の型指定が重要だとか。

速度でhhvmと良い勝負をしているという記事もちらほら見かけます。
hhvmも速度はかなりいいんですね!

さらに、C拡張の爆速フレームワーク(phalcon,ice framework)を組み合わせて、早いWebサービスを作りたいですなー
PHPでどこまで速度を出せるか!!