JavaScript Diary

問題 [ 2001/09/11 ]
以下のプログラムを見て下さい。
String.prototype.indexForByte = function( start, byte ){
    var str = this.substring( start ); // 調べる文字列を取得
    var count = 0 ; // バイト数
    for(var i=0;i<str.length;i++){
        if( escape( str.charAt(i) ).length >= 4 ){
            count += 2 ;
        }else{
            count++ ;
        }
        if( count > byte ) return i ;
    }
    return str.length ;
};

alert( "あいueお".indexForByte( 0, 5 ) );   // 結果は 3
alert( "あいうえお".indexForByte( 0, 8 ) ); // 結果は 4
alert( "aiうえお".indexForByte( 1, 3 ) );   // 結果は 2
このメソッドは「指定位置 start から、byte バイト分だけ進んだ位置を取得する」ものです。
例えば、"あいueお".indexForByte( 0, 5 ) は、0 番目の文字から 5 バイトですので、'あ'=2バイト、'い'=2バイト、'u'=1バイトなので、結果は 3 になります。
これらの結果は InternetExplorer5 によるものですが、このプログラムを Netscape4.7, Netscape6 で実行するとエラーになります。
そのエラーの原因を当ててみて下さい。答えは次回、ここに公開します。(エラーはアルゴリズムやロジック的なものではなく,パッと見て気付くものです)
ちなみにこのメソッドは作成途中の Links コンテンツで実装したものですが、Netscape4 でこの一つのエラーのためにえらい時間をロスってます。NS6を立ち上げてすぐに分かりましたが・・・。