[PHP-users 27297] Re: mb_strwidth() の結果が期待と異なる

Seiji Masugata s.masugata @ digicom.dnp.co.jp
2005年 10月 25日 (火) 13:30:12 JST


こんにちわ、桝形です。

> この動作が"正しい"動作なのかどうかは僕には判りかねるのですが、
> 例外として?幅が2として取れないケースがあるのであれば、そこら辺
> 何らかの形で明らかになっていると幸せです。

この件、ちょっと調べてみました。

----------------------------------------------------------------------
<?php
  $string = "99条99丁目1−11";
  $enc    = "EUC-JP"; // ←←←←←←←← ココ
  mb_internal_encoding($enc);

  print "mb_strwidth(): " . mb_strwidth($string, $enc) . "\n";
  print "mb_strlen(): " . mb_strlen($string, $enc) . "\n";

  $string = "−";
  print "mb_strwidth(): " . mb_strwidth($string, $enc) . "\n";
  print "mb_strlen(): " . mb_strlen($string, $enc) . "\n";
?>

結果
----
mb_strwidth(): 21
mb_strlen(): 11
mb_strwidth(): 1
mb_strlen(): 1
----------------------------------------------------------------------

ではなくて、

----------------------------------------------------------------------
<?php
  $string = "99条99丁目1−11";
  $enc    = "eucJP-win"; // ←←←←←←←← ココ
  mb_internal_encoding($enc);

  print "mb_strwidth(): " . mb_strwidth($string, $enc) . "\n";
  print "mb_strlen(): " . mb_strlen($string, $enc) . "\n";

  $string = "−";
  print "mb_strwidth(): " . mb_strwidth($string, $enc) . "\n";
  print "mb_strlen(): " . mb_strlen($string, $enc) . "\n";
?>

結果
----
mb_strwidth(): 22
mb_strlen(): 11
mb_strwidth(): 2
mb_strlen(): 1
----------------------------------------------------------------------

としてみたら、どうでしょうか。「eucJP-win」が重要です。

----------------------------------------------------------------------
<?php
  $string = "−";
  print bin2hex( mb_convert_encoding( $string, "UTF-8", "EUC-JP" ) ). "\n";
  print bin2hex( mb_convert_encoding( $string, "UTF-8", "eucJP-win" ) ). "\n";
?>

結果
----
e28892
efbc8d
----------------------------------------------------------------------

-- 
Seiji Masugata <s.masugata @ digicom.dnp.co.jp>



PHP-users メーリングリストの案内