Refine fix for multibyte char hanling inside command names and args(その後)
先日の件ですが、ありがたい事に助言を頂きました。
助言に従い確認してみると期待した結果になりました。
よかった。。。けど、今後マルチバイトを含める場合はlocaleを気にしないといけない事実は変わらないのか。
ただ、広範囲に影響が出る。。。というのは少なくとも自分の周りには無さそう(注意点という事で)。
Solarisではlocaleに「ja_JP.eucJP」が(まだ)設定できるけど、最近のLinuxでは設定できない事も多くなってきたので、そろそろ文字コードについてはUTF-8にしなさい。。。って事なのかしら。
それにしても、この件については大変勉強になりました。本当にありがとうございました。<(_ _)>
以下は単なる確認なので適当に無視してください。
こっちがSolarisでの結果。
% cd /usr/local/src % gzip -dc php5.2-200804020230.tar.gz | gtar xf - % cd php5.2-200804020230 ./configure \ --disable-all \ --without-iconv \ --enable-mbstring \ --enable-debug % make % cp sapi/cli/php /usr/local/src/php5.2-200804020230-cli % cd /usr/local/src % cat ./exec2.php <?php setlocale( LC_ALL, "" ); var_dump( PHP_VERSION ); var_dump( PHP_OS ); var_dump( strftime("%A %e %B %Y", mktime( 0, 0, 0, 12, 22, 1978 ) ) ); /* encoding is EUC-JP */ var_dump( escapeshellcmd( "/usr/local/src/あ" ) ); var_dump( escapeshellarg( "/usr/local/src/あ" ) ); var_dump( escapeshellcmd( "'/usr/local/src/あ'" ) ); var_dump( escapeshellarg( "'/usr/local/src/あ'" ) ); var_dump( escapeshellcmd( '"/usr/local/src/あ"' ) ); var_dump( escapeshellarg( '"/usr/local/src/あ"' ) ); var_dump( escapeshellcmd( "/usr/local/あ/src" ) ); var_dump( escapeshellarg( "/usr/local/あ/src" ) ); var_dump( escapeshellcmd( "'/usr/local/あ/src'" ) ); var_dump( escapeshellarg( "'/usr/local/あ/src'" ) ); var_dump( escapeshellcmd( '"/usr/local/あ/src"' ) ); var_dump( escapeshellarg( '"/usr/local/あ/src"' ) ); ?> % cat ./exec2-utf8.php <?php setlocale( LC_ALL, "" ); var_dump( PHP_VERSION ); var_dump( PHP_OS ); var_dump( strftime("%A %e %B %Y", mktime( 0, 0, 0, 12, 22, 1978 ) ) ); /* encoding is UTF-8 */ var_dump( escapeshellcmd( "/usr/local/src/あ" ) ); var_dump( escapeshellarg( "/usr/local/src/あ" ) ); var_dump( escapeshellcmd( "'/usr/local/src/あ'" ) ); var_dump( escapeshellarg( "'/usr/local/src/あ'" ) ); var_dump( escapeshellcmd( '"/usr/local/src/あ"' ) ); var_dump( escapeshellarg( '"/usr/local/src/あ"' ) ); var_dump( escapeshellcmd( "/usr/local/あ/src" ) ); var_dump( escapeshellarg( "/usr/local/あ/src" ) ); var_dump( escapeshellcmd( "'/usr/local/あ/src'" ) ); var_dump( escapeshellarg( "'/usr/local/あ/src'" ) ); var_dump( escapeshellcmd( '"/usr/local/あ/src"' ) ); var_dump( escapeshellarg( '"/usr/local/あ/src"' ) ); ?> % cat ./mblen2.c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <locale.h> int main( void ) { const char *target = "あAいBうCえDおE"; /* encoding is EUC-JP */ int x, y, size; setlocale (LC_ALL, "" ); size = strlen( target ); fprintf( stdout, "[DBG]:----------------------------------\n" ); fprintf( stdout, "[DBG]: size = %d\n", size ); for( x = 0; x < size; ++x ) { y = mblen( ( target + x ), ( size - x ) ); fprintf( stdout, "[DBG]:----------------------------------\n" ); fprintf( stdout, "[DBG]: now = %d\n", x ); fprintf( stdout, "[DBG]: mblen = %d\n", y ); if( y > 1 ) { x += ( y - 1 ); } } return 0; } % cat ./mblen2-utf8.c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <locale.h> int main( void ) { const char *target = "あAいBうCえDおE"; /* encoding is UTF-8 */ int x, y, size; setlocale (LC_ALL, "" ); size = strlen( target ); fprintf( stdout, "[DBG]:----------------------------------\n" ); fprintf( stdout, "[DBG]: size = %d\n", size ); for( x = 0; x < size; ++x ) { y = mblen( ( target + x ), ( size - x ) ); fprintf( stdout, "[DBG]:----------------------------------\n" ); fprintf( stdout, "[DBG]: now = %d\n", x ); fprintf( stdout, "[DBG]: mblen = %d\n", y ); if( y > 1 ) { x += ( y - 1 ); } } return 0; } % gcc -Wall -o ./mblen2 ./mblen2.c % gcc -Wall -o ./mblen2-utf8 ./mblen2-utf8.c % ./php5.2-200804020230-cli ./exec2.php string(12) "5.2.6RC4-dev" string(5) "SunOS" string(23) "Friday 22 December 1978" /* result encoding is ASCII */ string(17) "/usr/local/src/あ" string(19) "'/usr/local/src/あ'" string(19) "'/usr/local/src/あ'" string(27) "''\''/usr/local/src/あ'\'''" string(19) ""/usr/local/src/あ"" string(21) "'"/usr/local/src/あ"'" string(17) "/usr/local/あ/src" string(19) "'/usr/local/あ/src'" string(19) "'/usr/local/あ/src'" string(27) "''\''/usr/local/あ/src'\'''" string(19) ""/usr/local/あ/src"" string(21) "'"/usr/local/あ/src"'" % ./php5.2-200804020230-cli ./exec2-utf8.php string(12) "5.2.6RC4-dev" string(5) "SunOS" string(23) "Friday 22 December 1978" /* result encoding is ASCII */ string(18) "/usr/local/src/あ" string(20) "'/usr/local/src/あ'" string(20) "'/usr/local/src/あ'" string(28) "''\''/usr/local/src/あ'\'''" string(20) ""/usr/local/src/あ"" string(22) "'"/usr/local/src/あ"'" string(18) "/usr/local/あ/src" string(20) "'/usr/local/あ/src'" string(20) "'/usr/local/あ/src'" string(28) "''\''/usr/local/あ/src'\'''" string(20) ""/usr/local/あ/src"" string(22) "'"/usr/local/あ/src"'" % ./mblen2 [DBG]:---------------------------------- [DBG]: size = 15 [DBG]:---------------------------------- [DBG]: now = 0 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 1 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 2 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 3 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 4 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 5 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 6 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 7 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 8 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 9 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 10 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 11 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 12 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 13 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 14 [DBG]: mblen = 1 % ./mblen2-utf8 [DBG]:---------------------------------- [DBG]: size = 20 [DBG]:---------------------------------- [DBG]: now = 0 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 1 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 2 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 3 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 4 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 5 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 6 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 7 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 8 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 9 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 10 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 11 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 12 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 13 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 14 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 15 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 16 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 17 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 18 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 19 [DBG]: mblen = 1 % locale LANG=C LC_CTYPE="C" LC_NUMERIC="C" LC_TIME="C" LC_COLLATE="C" LC_MONETARY="C" LC_MESSAGES="C" LC_ALL=C % setenv LC_ALL ja_JP.eucJP % ./php5.2-200804020230-cli ./exec2.php string(12) "5.2.6RC4-dev" string(5) "SunOS" string(19) "金曜日 22 12月 1978" /* result encoding is EUC-JP */ string(17) "/usr/local/src/あ" string(19) "'/usr/local/src/あ'" string(19) "'/usr/local/src/あ'" string(27) "''\''/usr/local/src/あ'\'''" string(19) ""/usr/local/src/あ"" string(21) "'"/usr/local/src/あ"'" string(17) "/usr/local/あ/src" string(19) "'/usr/local/あ/src'" string(19) "'/usr/local/あ/src'" string(27) "''\''/usr/local/あ/src'\'''" string(19) ""/usr/local/あ/src"" string(21) "'"/usr/local/あ/src"'" % ./php5.2-200804020230-cli ./exec2-utf8.php string(12) "5.2.6RC4-dev" string(5) "SunOS" string(19) "金曜日 22 12月 1978" /* result encoding is EUC-JP */ string(17) "/usr/local/src/" string(19) "'/usr/local/src/'" string(19) "'/usr/local/src/'" string(27) "''\''/usr/local/src/'\'''" string(19) ""/usr/local/src/"" string(21) "'"/usr/local/src/"'" string(17) "/usr/local//src" string(19) "'/usr/local//src'" string(19) "'/usr/local//src'" string(27) "''\''/usr/local//src'\'''" string(19) ""/usr/local//src"" string(21) "'"/usr/local//src"'" % ./mblen2 [DBG]:---------------------------------- [DBG]: size = 15 [DBG]:---------------------------------- [DBG]: now = 0 [DBG]: mblen = 2 [DBG]:---------------------------------- [DBG]: now = 2 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 3 [DBG]: mblen = 2 [DBG]:---------------------------------- [DBG]: now = 5 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 6 [DBG]: mblen = 2 [DBG]:---------------------------------- [DBG]: now = 8 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 9 [DBG]: mblen = 2 [DBG]:---------------------------------- [DBG]: now = 11 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 12 [DBG]: mblen = 2 [DBG]:---------------------------------- [DBG]: now = 14 [DBG]: mblen = 1 % ./mblen2-utf8 [DBG]:---------------------------------- [DBG]: size = 20 [DBG]:---------------------------------- [DBG]: now = 0 [DBG]: mblen = -1 [DBG]:---------------------------------- [DBG]: now = 1 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 2 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 3 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 4 [DBG]: mblen = -1 [DBG]:---------------------------------- [DBG]: now = 5 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 6 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 7 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 8 [DBG]: mblen = -1 [DBG]:---------------------------------- [DBG]: now = 9 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 10 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 11 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 12 [DBG]: mblen = -1 [DBG]:---------------------------------- [DBG]: now = 13 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 14 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 15 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 16 [DBG]: mblen = -1 [DBG]:---------------------------------- [DBG]: now = 17 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 18 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 19 [DBG]: mblen = 1 % locale | grep LC_ALL LC_ALL=ja_JP.eucJP % setenv LC_ALL ja_JP.UTF-8 % ./php5.2-200804020230-cli ./exec2.php string(12) "5.2.6RC4-dev" string(5) "SunOS" string(23) "金曜日 22 12月 1978" /* result encoding is UTF-8 */ string(15) "/usr/local/src/" string(17) "'/usr/local/src/'" string(17) "'/usr/local/src/'" string(25) "''\''/usr/local/src/'\'''" string(17) ""/usr/local/src/"" string(19) "'"/usr/local/src/"'" string(15) "/usr/local//src" string(17) "'/usr/local//src'" string(17) "'/usr/local//src'" string(25) "''\''/usr/local//src'\'''" string(17) ""/usr/local//src"" string(19) "'"/usr/local//src"'" % ./php5.2-200804020230-cli ./exec2-utf8.php string(12) "5.2.6RC4-dev" string(5) "SunOS" string(23) "金曜日 22 12月 1978" /* result encoding is UTF-8 */ string(18) "/usr/local/src/あ" string(20) "'/usr/local/src/あ'" string(20) "'/usr/local/src/あ'" string(28) "''\''/usr/local/src/あ'\'''" string(20) ""/usr/local/src/あ"" string(22) "'"/usr/local/src/あ"'" string(18) "/usr/local/あ/src" string(20) "'/usr/local/あ/src'" string(20) "'/usr/local/あ/src'" string(28) "''\''/usr/local/あ/src'\'''" string(20) ""/usr/local/あ/src"" string(22) "'"/usr/local/あ/src"'" % ./mblen2 [DBG]:---------------------------------- [DBG]: size = 15 [DBG]:---------------------------------- [DBG]: now = 0 [DBG]: mblen = -1 [DBG]:---------------------------------- [DBG]: now = 1 [DBG]: mblen = -1 [DBG]:---------------------------------- [DBG]: now = 2 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 3 [DBG]: mblen = -1 [DBG]:---------------------------------- [DBG]: now = 4 [DBG]: mblen = -1 [DBG]:---------------------------------- [DBG]: now = 5 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 6 [DBG]: mblen = -1 [DBG]:---------------------------------- [DBG]: now = 7 [DBG]: mblen = -1 [DBG]:---------------------------------- [DBG]: now = 8 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 9 [DBG]: mblen = -1 [DBG]:---------------------------------- [DBG]: now = 10 [DBG]: mblen = -1 [DBG]:---------------------------------- [DBG]: now = 11 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 12 [DBG]: mblen = -1 [DBG]:---------------------------------- [DBG]: now = 13 [DBG]: mblen = -1 [DBG]:---------------------------------- [DBG]: now = 14 [DBG]: mblen = 1 % ./mblen2-utf8 [DBG]:---------------------------------- [DBG]: size = 20 [DBG]:---------------------------------- [DBG]: now = 0 [DBG]: mblen = 3 [DBG]:---------------------------------- [DBG]: now = 3 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 4 [DBG]: mblen = 3 [DBG]:---------------------------------- [DBG]: now = 7 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 8 [DBG]: mblen = 3 [DBG]:---------------------------------- [DBG]: now = 11 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 12 [DBG]: mblen = 3 [DBG]:---------------------------------- [DBG]: now = 15 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 16 [DBG]: mblen = 3 [DBG]:---------------------------------- [DBG]: now = 19 [DBG]: mblen = 1 % locale | grep LC_ALL LC_ALL=ja_JP.UTF-8 % uname -a SunOS **** 5.10 Generic_127111-05 sun4v sparc SUNW,Sun-Fire-T200 Solaris
こっちがLinuxでの結果。
localeに「ja_JP.eucJP」が設定できなかったので「ja_JP.UTF-8」のみの確認です。
% cd /usr/local/src % gzip -dc php5.2-200804020230.tar.gz | gtar xf - % cd php5.2-200804020230 ./configure \ --disable-all \ --without-iconv \ --enable-mbstring \ --enable-debug % make % cp sapi/cli/php /usr/local/src/php5.2-200804020230-cli % cd /usr/local/src % cat ./exec2-utf8.php <?php setlocale( LC_ALL, "" ); var_dump( PHP_VERSION ); var_dump( PHP_OS ); var_dump( strftime("%A %e %B %Y", mktime( 0, 0, 0, 12, 22, 1978 ) ) ); /* encoding is UTF-8 */ var_dump( escapeshellcmd( "/usr/local/src/あ" ) ); var_dump( escapeshellarg( "/usr/local/src/あ" ) ); var_dump( escapeshellcmd( "'/usr/local/src/あ'" ) ); var_dump( escapeshellarg( "'/usr/local/src/あ'" ) ); var_dump( escapeshellcmd( '"/usr/local/src/あ"' ) ); var_dump( escapeshellarg( '"/usr/local/src/あ"' ) ); var_dump( escapeshellcmd( "/usr/local/あ/src" ) ); var_dump( escapeshellarg( "/usr/local/あ/src" ) ); var_dump( escapeshellcmd( "'/usr/local/あ/src'" ) ); var_dump( escapeshellarg( "'/usr/local/あ/src'" ) ); var_dump( escapeshellcmd( '"/usr/local/あ/src"' ) ); var_dump( escapeshellarg( '"/usr/local/あ/src"' ) ); ?> % cat ./mblen2-utf8.c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <locale.h> int main( void ) { const char *target = "あAいBうCえDおE"; /* encoding is UTF-8 */ int x, y, size; setlocale (LC_ALL, "" ); size = strlen( target ); fprintf( stdout, "[DBG]:----------------------------------\n" ); fprintf( stdout, "[DBG]: size = %d\n", size ); for( x = 0; x < size; ++x ) { y = mblen( ( target + x ), ( size - x ) ); fprintf( stdout, "[DBG]:----------------------------------\n" ); fprintf( stdout, "[DBG]: now = %d\n", x ); fprintf( stdout, "[DBG]: mblen = %d\n", y ); if( y > 1 ) { x += ( y - 1 ); } } return 0; } % gcc -Wall -o ./mblen2-utf8 ./mblen2-utf8.c % ./php5.2-200804020230-cli ./exec2-utf8.php string(12) "5.2.6RC4-dev" string(5) "Linux" string(23) "Friday 22 December 1978" /* result encoding is ASCII */ string(15) "/usr/local/src/" string(17) "'/usr/local/src/'" string(17) "'/usr/local/src/'" string(25) "''\''/usr/local/src/'\'''" string(17) ""/usr/local/src/"" string(19) "'"/usr/local/src/"'" string(15) "/usr/local//src" string(17) "'/usr/local//src'" string(17) "'/usr/local//src'" string(25) "''\''/usr/local//src'\'''" string(17) ""/usr/local//src"" string(19) "'"/usr/local//src"'" % ./mblen2-utf8 [DBG]:---------------------------------- [DBG]: size = 20 [DBG]:---------------------------------- [DBG]: now = 0 [DBG]: mblen = -1 [DBG]:---------------------------------- [DBG]: now = 1 [DBG]: mblen = -1 [DBG]:---------------------------------- [DBG]: now = 2 [DBG]: mblen = -1 [DBG]:---------------------------------- [DBG]: now = 3 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 4 [DBG]: mblen = -1 [DBG]:---------------------------------- [DBG]: now = 5 [DBG]: mblen = -1 [DBG]:---------------------------------- [DBG]: now = 6 [DBG]: mblen = -1 [DBG]:---------------------------------- [DBG]: now = 7 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 8 [DBG]: mblen = -1 [DBG]:---------------------------------- [DBG]: now = 9 [DBG]: mblen = -1 [DBG]:---------------------------------- [DBG]: now = 10 [DBG]: mblen = -1 [DBG]:---------------------------------- [DBG]: now = 11 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 12 [DBG]: mblen = -1 [DBG]:---------------------------------- [DBG]: now = 13 [DBG]: mblen = -1 [DBG]:---------------------------------- [DBG]: now = 14 [DBG]: mblen = -1 [DBG]:---------------------------------- [DBG]: now = 15 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 16 [DBG]: mblen = -1 [DBG]:---------------------------------- [DBG]: now = 17 [DBG]: mblen = -1 [DBG]:---------------------------------- [DBG]: now = 18 [DBG]: mblen = -1 [DBG]:---------------------------------- [DBG]: now = 19 [DBG]: mblen = 1 % locale LANG=C LANGUAGE=C LC_CTYPE="C" LC_NUMERIC="C" LC_TIME="C" LC_COLLATE="C" LC_MONETARY="C" LC_MESSAGES="C" LC_PAPER="C" LC_NAME="C" LC_ADDRESS="C" LC_TELEPHONE="C" LC_MEASUREMENT="C" LC_IDENTIFICATION="C" LC_ALL=C % setenv LC_ALL ja_JP.UTF-8 % ./php5.2-200804020230-cli ./exec2-utf8.php string(12) "5.2.6RC4-dev" string(5) "Linux" string(23) "金曜日 22 12月 1978" /* result encoding is UTF-8 */ string(18) "/usr/local/src/あ" string(20) "'/usr/local/src/あ'" string(20) "'/usr/local/src/あ'" string(28) "''\''/usr/local/src/あ'\'''" string(20) ""/usr/local/src/あ"" string(22) "'"/usr/local/src/あ"'" string(18) "/usr/local/あ/src" string(20) "'/usr/local/あ/src'" string(20) "'/usr/local/あ/src'" string(28) "''\''/usr/local/あ/src'\'''" string(20) ""/usr/local/あ/src"" string(22) "'"/usr/local/あ/src"'" % ./mblen2-utf8 [DBG]:---------------------------------- [DBG]: size = 20 [DBG]:---------------------------------- [DBG]: now = 0 [DBG]: mblen = 3 [DBG]:---------------------------------- [DBG]: now = 3 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 4 [DBG]: mblen = 3 [DBG]:---------------------------------- [DBG]: now = 7 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 8 [DBG]: mblen = 3 [DBG]:---------------------------------- [DBG]: now = 11 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 12 [DBG]: mblen = 3 [DBG]:---------------------------------- [DBG]: now = 15 [DBG]: mblen = 1 [DBG]:---------------------------------- [DBG]: now = 16 [DBG]: mblen = 3 [DBG]:---------------------------------- [DBG]: now = 19 [DBG]: mblen = 1 % locale | grep LC_ALL LC_ALL=ja_JP.UTF-8 % uname -a Linux **** 2.6.18-6-686 #1 SMP Sun Feb 10 22:11:31 UTC 2008 i686 GNU/Linux