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