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

Seiji Masugata s.masugata @ digicom.dnp.co.jp
2005年 10月 26日 (水) 11:16:33 JST


こんにちわ、桝形です。
ドタバタしてたので、連絡が遅れましてスミマセン。

> これって、PHP4.3.11以降(?)はEUC-JPではなくeucJP-winを使うのが
> 無難という事になりますか?
> EUC-JPで僕の期待通りに動かないというケースがmb_strwidth()だけで
> あれば、EUC-JPでも良いのかなと思うのですが、他のmb_系関数も
> 何かあったりするのでしょうか。

文字コードについては自分も詳しくないので識者の意見を参考にして
頂きたいトコロですが、
http://dev.mysql.com/doc/refman/4.1/ja/charset-cp932.html

このページが参考になるのかなぁ。。。という気がします。

> > いくつかの文字については、sjisとcp932で ucs2との変換ルールが異なる。以下の表ではその違いを説明している。

という辺りです。

----------------------------------------------------------------------
<?php

  $string = "−";
  echo bin2hex( mb_convert_encoding( $string, "SJIS",     "EUC-JP" ) )."\n";
  echo bin2hex( mb_convert_encoding( $string, "SJIS-win", "EUC-JP" ) )."\n";
  echo bin2hex( mb_convert_encoding( $string, "SJIS", "    eucJP-win" ) )."\n";
  echo bin2hex( mb_convert_encoding( $string, "SJIS-win", "eucJP-win" ) )."\n";

  $string = mb_convert_encoding( $string, "SJIS-win", "eucJP-win" );
  echo bin2hex( mb_convert_encoding( $string, "UCS2", "SJIS" ) )."\n";
  echo bin2hex( mb_convert_encoding( $string, "UCS2", "SJIS-win" ) )."\n";
  echo bin2hex( mb_convert_encoding( $string, "UCS4", "SJIS" ) )."\n";
  echo bin2hex( mb_convert_encoding( $string, "UCS4", "SJIS-win" ) )."\n";

?>

結果
----
817c
817c
817c
817c
2212
ff0d
00002212
0000ff0d
----------------------------------------------------------------------

> また、僕はそもそもeucJP-winの何たるかをちゃんと理解していないのですが、
> (機種依存文字を扱える、ぐらいしか知りません)
> mbstring周りの設定をEUC-JPの代わりにeucJP-winとして統一して、問題は
> 無いものなのでしょうか。

mb_strwidthについては、eucJP-win(もしくはSJIS-win)にしないといけない
感じがしますが、個人的には全体的にeucJP-winでもいいんじゃね?という気も
します。

ただ、eucJP-winとEUC−JPは厳密には違うので用途に応じて使い分ける、という
事くらいしかアドヴァイスできません。こんな回答でスミマセン。

http://bugs.php.net/bug.php?id=28220
http://www.unicode.org/Public/UNIDATA/EastAsianWidth.txt

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



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