ます’s Blog - どうでもいい記事100選

どうでもいい記事100選

make test for 4.4.3RC1(続き)- mb_strlen編

先日のですが。
昨日に引き続き、今度はmb_strlen関数。
mb_strlen関数のテストが失敗していましたが、これは前からのようです(コレの「JIS」と「UTF-8」)。
って、よく見てみると「either convert_encoding or strlen has problem」って記載されてますが。
まずはテスト。

<?php

  declare( encoding="EUC-JP" );

  echo PHP_VERSION."\n";
  var_dump( mb_language( ) );
  var_dump( mb_internal_encoding( ) );

  $euc_jp = "0123この文字列は日本語です。EUC-JPを使っています。0123日本語は面倒臭い。";

  $sjis = mb_convert_encoding($euc_jp, "SJIS" );
  var_dump( strlen( $sjis ) );
  mb_internal_encoding( "SJIS" );
  var_dump( strlen( $sjis ) );

  $jis = mb_convert_encoding( $euc_jp, "JIS" );
  var_dump( strlen( $jis ) );
  mb_internal_encoding( "JIS" );
  var_dump( strlen( $jis ) );

  $utf8 = mb_convert_encoding( $euc_jp, "UTF-8" );
  var_dump( strlen( $utf8 ) );
  mb_internal_encoding( "UTF-8" );
  var_dump( strlen( $utf8 ) );

?>

結果
----
% ./php-4.3.3-cli ./mb_strlen1.php
4.3.3
string(8) "Japanese"
string(9) "eucJP-win"
int(72)
int(72)
int(126)
int(126)
int(188)
int(188)

% ./php-4.3.9-cli ./mb_strlen1.php
4.3.9
string(8) "Japanese"
string(9) "eucJP-win"
int(72)
int(72)
int(126)
int(126)
int(188)
int(188)

% ./php-4.3.11-cli ./mb_strlen1.php
4.3.11
string(8) "Japanese"
string(9) "eucJP-win"
int(72)
int(72)
int(126)
int(126)
int(188)
int(188)

% ./php-4.4.1-cli ./mb_strlen1.php
4.4.1
string(8) "Japanese"
string(9) "eucJP-win"
int(72)
int(72)
int(126)
int(126)
int(188)
int(188)

% ./php-4.4.2-cli ./mb_strlen1.php
4.4.2
string(8) "Japanese"
string(9) "eucJP-win"
int(72)
int(72)
int(126)
int(126)
int(188)
int(188)

% ./php-4.4.3RC1-cli ./mb_strlen1.php
4.4.3RC1
string(8) "Japanese"
string(9) "eucJP-win"
int(72)
int(72)
int(126)
int(126)
int(188)
int(188)

確かに同じように失敗しています。。。。が、このプログラムは本当に正しいのでしょうか。
mb_convert_encoding関数の第3引数(from_encoding)が無いんですよねぇ。処理の途中でmb_internal_encoding関数を使って内部コードを変更しているにも関わらず。
こうなると変な変換処理になってしまうと思うんだけどなぁ。。。第3引数(from_encoding)を正しく指定した結果は以下の通り。

<?php

  declare( encoding="EUC-JP" );

  echo PHP_VERSION."\n";
  var_dump( mb_language( ) );
  var_dump( mb_internal_encoding( ) );

  $euc_jp = "0123この文字列は日本語です。EUC-JPを使っています。0123日本語は面倒臭い。";

  $sjis = mb_convert_encoding($euc_jp, "SJIS", "EUC-JP" );
  var_dump( strlen( $sjis ) );
  mb_internal_encoding( "SJIS" );
  var_dump( strlen( $sjis ) );

  $jis = mb_convert_encoding( $euc_jp, "JIS", "EUC-JP" );
  var_dump( strlen( $jis ) );
  mb_internal_encoding( "JIS" );
  var_dump( strlen( $jis ) );

  $utf8 = mb_convert_encoding( $euc_jp, "UTF-8", "EUC-JP" );
  var_dump( strlen( $utf8 ) );
  mb_internal_encoding( "UTF-8" );
  var_dump( strlen( $utf8 ) );

?>

結果
----
% ./php-4.3.3-cli ./mb_strlen2.php
4.3.3
string(8) "Japanese"
string(9) "eucJP-win"
int(72)
int(72)
int(90)
int(90)
int(101)
int(101)

% ./php-4.3.9-cli ./mb_strlen2.php
4.3.9
string(8) "Japanese"
string(9) "eucJP-win"
int(72)
int(72)
int(90)
int(90)
int(101)
int(101)

% ./php-4.3.11-cli ./mb_strlen2.php
4.3.11
string(8) "Japanese"
string(9) "eucJP-win"
int(72)
int(72)
int(90)
int(90)
int(101)
int(101)

% ./php-4.4.1-cli ./mb_strlen2.php
4.4.1
string(8) "Japanese"
string(9) "eucJP-win"
int(72)
int(72)
int(90)
int(90)
int(101)
int(101)

% ./php-4.4.2-cli ./mb_strlen2.php
4.4.2
string(8) "Japanese"
string(9) "eucJP-win"
int(72)
int(72)
int(90)
int(90)
int(101)
int(101)

% ./php-4.4.3RC1-cli ./mb_strlen2.php
4.4.3RC1
string(8) "Japanese"
string(9) "eucJP-win"
int(72)
int(72)
int(90)
int(90)
int(101)
int(101)

意図的にやってるのかは不明ですが。。。ま、結局は期待値が間違っていたという事なのだろうか。ちょっと安心。(w
(確認した上で)テスト・プログラムを修正しておかないと。。。