plasmasphere.net -プラズマスフィア ドットネット-

Diary

JavaScript マルチバイト文字を2文字とした抜き出し

2012/06/30(Sat) 00:06

JavaScriptでバイト計算させるとか狂気の沙汰やで…。
ってことでStringを拡張して、シングルバイトを1文字、マルチバイトを2文字として扱う関数を作りました。
文字長と指定文字の抜き出し関数の2つです。

文字長の取得。
'TEST文字列'.byteLength() とか使うといいよ!
上記の場合は10(Number)で返ってきます。


// 文字列長を取得、シングルバイトは1文字、マルチバイトは2文字として取得する
String.prototype.byteLength = function() {
var l = 0,
str = escape(this.concat()),
length = str.length;
if( str ) {
for( var i = 0; i < length; i++ ) {
if( str.charAt(i) == '%' && str.charAt(i+1) == 'u' ) {
i += 5;
l++;
} else if( str.charAt(i) == '%' && ( str.charAt(i+1) == '2' || str.charAt(i+1) == '3' || str.charAt(i+1) == '5' || str.charAt(i+1) == '7' ) ) {
// *+-./@_以外の文字
i += 2;
}
l++;
}
return l;
} else {
return 0;
}
};

次はsubstrのバイト対応。
'TEST文字列'.byteSubstr( 0, 6 ) だと前の6文字(TEST文)が返ってきます。
(0,5)だとTESTまでしか返しません。

// String().substr をバイト長に対応させたメソッド、シングルバイトは1文字、マルチバイトは2文字として処理する
String.prototype.byteSubstr = function( start, max ) {
	if( start >= this.byteLength() ) {
		return this.concat();
	} else {
		if( start < 0 ) {
			start = 0;
		}
		var l = 0,
			str = escape(this.concat()),
			length = str.length,
			val = '';
		try {
			for( var i = 0; i < length; i++ ) {
				var s = i,
					c = 1;
				if( str.charAt(i) == '%' && str.charAt(i+1) == 'u' ) {
					i += 5;
					l++;
					c = 6;
				} else if( str.charAt(i) == '%' && ( str.charAt(i+1) == '2' || str.charAt(i+1) == '3' || str.charAt(i+1) == '5' || str.charAt(i+1) == '7' ) ) {
					// *+-./@_以外の文字
					i += 2;
					c = 3;
				}
				l++;
				if( l > max ) {
					break;
				}
				if( l >= start ) {
					val += str.substr( s, c );
				}
			}
			return unescape( val );
		} catch (e) {
			throw 'Error: byteSubstr [ ' + e + ' ]';
		}
	}
};

使いそうで使わない関数ですが、要り用ならどうぞ持って行ってください。
bytestring-min.js


似てるっぽいネタ


 
© 1999- plasmasphere.net All rights reserved.