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
