[PHP-users 27292] Re: mb_strwidth()の結果が期待と異なる
Shu Sawada
luna @ lunanet.gr.jp
2005年 10月 25日 (火) 01:33:23 JST
さわだです。
この事象は、4.3.11でアップデートされたlibmbflの影響だったりする
でしょうか?(根拠ありませんが)
とりあえずmb_strwidth()を使うにはどうすればいいかと、悪あがきして
みました。
-----
<?php
mb_internal_encoding("EUC-JP");
$string = "\〜‖−¢£¬";
print "string:" . $string . "\n";
print "mb_strwidth:" . mb_strwidth($string) . "\n";
print "my_mb_strwidth:" . my_mb_strwidth($string) . "\n";
/*
print "a1c0:" . mb_strwidth( hex2bin('a1c0') ) . "\n";
print "a1c1:" . mb_strwidth( hex2bin('a1c1') ) . "\n";
print "a1c2:" . mb_strwidth( hex2bin('a1c2') ) . "\n";
print "a1dd:" . mb_strwidth( hex2bin('a1dd') ) . "\n";
print "a1f1:" . mb_strwidth( hex2bin('a1f1') ) . "\n";
print "a1f2:" . mb_strwidth( hex2bin('a1f2') ) . "\n";
print "a2cc:" . mb_strwidth( hex2bin('a2cc') ) . "\n";
*/
function my_mb_strwidth( $string )
{
$plus = 0;
//FULLWIDTH REVERSE SOLIDUS
//$plus += mb_substr_count($string, hex2bin('a1c0'), "EUC-JP");
//FULLWIDTH TILDE
//$plus += mb_substr_count($string, hex2bin('a1c1'), "EUC-JP");
//PARALLEL TO
$plus += mb_substr_count($string, hex2bin('a1c2'), "EUC-JP");
//FULLWIDTH HYPHEN-MINUS
$plus += mb_substr_count($string, hex2bin('a1dd'), "EUC-JP");
//FULLWIDTH CENT SIGN
$plus += mb_substr_count($string, hex2bin('a1f1'), "EUC-JP");
//FULLWIDTH POUND SIGN
$plus += mb_substr_count($string, hex2bin('a1f2'), "EUC-JP");
//FULLWIDTH NOT SIGN
$plus += mb_substr_count($string, hex2bin('a2cc'), "EUC-JP");
return( mb_strwidth($string) + $plus );
}
function hex2bin($hex)
{
$len = strlen($hex);
return pack("H" . $len, $hex);
}
?>
-----
mb_strwidth()を使う必要があるときは、こんな感じで逃げれば
良いのでしょうか?
ext/mbstring/libmbfl/filters/mbfilter_euc_jp_win.c で特別に分岐
しているものを無理やり幅=2にしているだけです。
ただ、どの文字の幅を何故判定できないのかがよく判っていない、というか、
ここら辺の話は難しくて、、、
#使わないのが一番手っ取り早い?
#そもそも再現が僕の手元だけだったらすみません。
たぶん何かを間違っていると思います。
どの文字が危険、というのが判ると非常にありがたいです。
識者の方、ご教示いただけないでしょうか。
何卒宜しくお願いいたします。
--
Shu Sawada
http://luna.lunanet.gr.jp/
PHP-users メーリングリストの案内