[strlen,mb_strlen]日本語の文字数を調べる

公開日| 2015年4月19日   更新日| 2015年4月19日   コメントはありません。

今回は、phpでの日本語の取扱い方です。最初は、日本語の文字数を調べるにはどうすれば良いか考えてみましょう。
まずは、Javaで書いてみましょうか。

1
2
3
4
5
6
7
8
9
10
11
12
13
import java.io.Console;
 
public class jap {
	public static void main(String[] args) {
		//	日本語文字列
		String str = "にほんご?";
		//	文字列の長さを求める
		int len = str.length();
		//	文字列の長さをコンソールへ出力
		Console con = System.console();
		con.printf("[%d]%s\n",len,str);
	}
}

ただ、javacでコンパイルするときに注意が必要です。
Windowsの場合、ソースファイルの文字コードがShiftJisなら、何も指定しなくてもOK。
ソースファイルの文字コードが、ShiftJisでなく、例えば、UTF-8なら、以下のようにエンコードを指定してコンパイルします。

C:\ > javac -encoding utf-8 jap.java

実行してみると

C:\ > java jap
[5]にほんご?

と、こんな感じです。文字数をきれいに出力してくれます。

では、phpでは?

1
2
3
4
5
6
7
8
<?php
//	日本語文字列
$str = "にほんご?";
//	文字列の長さを求める
$len = strlen($str);
//	文字列の長さをコンソールへ出力
printf("[%d]%s\n",$len,$str);
?>
C:\>php jap.php
[10]にほんご?

とこんな感じです。同じようにstrlenを使ってみましたが、結果は、違います。
ソースコードがUTF-8だと、今度は、以下のように出力されます。

C:\>php jap.php
[15]縺ォ縺サ繧薙#・・

とこんな感じです。コンソールは、ShiftJISにのみ対応していますので、文字化けするのは、わかりますけど、文字数は、15となっています。

これは、javaとphpの基本的な文字列の内部処理の考え方の違いによります。

javaは、基本的に内部では、文字列をUNICODE(UTF-16)で処理します。
それに対してphpは、特別な指定をしない限りは、ソースコードの文字コードに依存します。

つまりは、phpは、文字コードは、書かれたまま処理される・・ということですね。
それに対してjavaは、javacでコンパイルするときにUTF-16へ変換されます。

・・ということで、phpのstrlenは、バイト数を出力していることがわかります。
では、phpで日本語の文字数を調べる場合、どうすればよいでしょうか?

日本語の文字数を調べる関数は?

日本語の文字数を調べる関数は、以下のとおりです。

  • int mb_strlen ( string $str [, string $encoding ] )
    : 文字列の長さを取得します。

    //	日本語文字列
    $str = "にほんご?ABC012";
     
    //	文字列の長さをコンソールへ出力
    printf("ShiftJIS[%d] strlen=%d\n",mb_strlen($str,'sjis-win'),strlen($str));
     
    $str_utf8 = mb_convert_encoding($str,'UTF-8','sjis-win');
    printf("UTF-8[%d] strlen=%d\n",mb_strlen($str_utf8,'UTF-8'),strlen($str_utf8));
     
    $str_utf16 = mb_convert_encoding($str,'UTF-16','sjis-win');
    printf("UTF-16[%d] strlen=%d\n",mb_strlen($str_utf16,'UTF-16'),strlen($str_utf16));
    C:\>php jap_len.php
    ShiftJIS[11] strlen=16
    UTF-8[11] strlen=21
    UTF-16[11] strlen=22
    []内のmb_strlenで調べて文字数は、すべて11に対してstrlenで調べた文字数は、ばらばらなのがわかります。
    mb_strlenで日本語の文字数が、どの文字コードでも正しく調べることができることがわかります。

  • string mb_convert_encoding ( string $str , string $to_encoding [, mixed $from_encoding ] )
    : 文字列 strの文字エンコーディングを、 オプションで指定した from_encoding から to_encoding に変換します。

    上記の例を参照ください。


上記のような日本語のマルチバイト文字列(ShiftJIS,UTF-8,eucなど)を取り扱う場合、mb_strlenのように先頭にmb_の付いた関数を使います。
通常の文字列操作で用いる関数に対して、マルチバイト文字列操作用の関数が1対1で用意されていますので、日本語を意識する必要がある場合は、そちらを用いるようにしましょう。

マルチバイト文字列(mbstring)を利用するには、拡張DLLをphp.iniで指定する必要があります。
例えば、以下のように直接的にフルパスを指定してあげると使えるようになります。
extension=C:\uty\php\ext\php_mbstring.dll


コメント

口コミ・評判を投稿 :

ブラウザの JavaScriptが無効となっている場合、コメントの投稿はできません。
コメントを投稿するには、JavaScriptを有効にしてください

お名前 *

メールアドレス *
(口コミ・評判欄には、表示されませんが入力が必要です。)

サイトアドレス



  • はてなブックマークへ追加する
  • Facebookでシェアする
  • twitter でつぶやく
  • Google Plusでシェアする
  • Pocketでシェアする
ページトップへ