[AS3] 全角(2バイト)と半角(1バイト)を区別したバイト数の計算 [Edit]

2バイトの全角と1バイトの半角とを区別した文字のバイト数が、どのようにしたら求められるか考えてみましょう。

01 escapeMultiByte()関数を使う

まず、escapeMultiByte()関数でエスケープした文字列を調べることが考えられます。全角は9バイトでアルファベットは1バイトです。ただし、半角でも3バイトの記号などがあることに注意しなければなりません(下表001)。

trace(getBytesTotal_escapeMultiByte("くぁwせdrftgyふじこlp"));   // 出力: 21
スクリプト001■escapeMultiByte()関数でバイト数を調べる
function getBytesTotal_escapeMultiByte(_str:String):uint {
	var nCount:uint = 0;
	var nLength:int = _str.length;
	for (var i:uint = 0; i < nLength; i++) {
		nCount += (escapeMultiByte(_str.charAt(i)).length > 3) ? 2 : 1;
	}
	return nCount;
}

さらに、半角カナはエスケープしても全角と区別は困難です(表001)。予め半角カナが含まれないことさえ確かなら、この方法でも差し支えないでしょう。

表001■文字列のエスケープ例とバイト数
文字列例 エスケープ バイト数
%E3%81%82 9
a a 1
% %25 3
%EF%BD%B1 9

02 ByteArrayクラスを使う

Colin Moock氏は「GET NUMBER OF BYTES IN A UTF-8 STRING」と題するblog記事で、ByteArrayオブジェクトにより文字列のバイト数が得られることを紹介されました。さらに、永井勝則氏がFLASH-japanへの投稿で、そのスクリプトに手を加えられています。ByteArray.lengthプロパティでバイト数を求めるやり方です(スクリプト002)。半角カナは1バイトと数えられます。

trace(getBytesTotal_ByteArray("くぁwせdrftgyふじこlp"));   // 出力: 21
スクリプト002■ByteArrayクラスでバイト数を調べる
function getBytesTotal_ByteArray(_str:String):uint {
	var byteArray:ByteArray = new ByteArray();
	byteArray.writeMultiByte(_str, "shift-jis");
	return byteArray.length;
}

03 文字コードにより仕分けて数え上げる

実は、ステートメント数は増えるものの、ひと文字ずつコードを調べて数え上げる方が、処理としては速くなります(スクリプト003)。必要なら、文字コードをさらに細かく仕分けることもできます[*1]

trace(getBytesTotal_code("くぁwせdrftgyふじこlp"));   // 出力: 21
スクリプト003■文字コードを調べて数える
function getBytesTotal_code(_str:String):uint {
	var nCount:uint = 0;
	var nLength:int = _str.length;
	for (var i:uint = 0; i < nLength; i++) {
		var char_str:String = _str.charAt(i);
		var nCode:Number = char_str.charCodeAt(0);
		var bSingle:Boolean = (nCode < 0x7F) || (0xFF61 < nCode && nCode < 0xFF9F);
		nCount +=  bSingle ? 1 : 2;
	}
	return nCount;
}

参考までに、wonderflのテスト用スクリプトで、3つの手法を比べてみました。

Counting total bytes of characters to be distinguished between single and multi bytes - wonderfl build flash online


[*1] yoshiweb.NET「ActionScriptで文字判定」参照。

コメント

この記事へのコメント

  1. 1.Ремонт Kia(2011年02月25日 17:57)

    Thank you very much for that wonderful article

  2. 2.одежда интернет магазин дешево(2011年06月01日 15:46)

    hey,looks like we're on the same path. good stuff! come by and say hi! cheers Reginald Melchor

  3. 3.автоматическая торговля на форексе(2011年08月02日 01:44)

    Thank you very much for that excellent article

  4. 4.fresh fm(2011年08月02日 21:04)

    Thank you for this valuable post. It changed my way

  5. 5.Спецтехника ТАТА(2011年08月03日 03:03)

    useful information. It's really good

  6. 6.создать бесплатный блог на WordPress(2011年08月04日 03:55)

    Great article . Will definitely copy it to my site.Thanks.

  7. 7.обои 240х320(2011年09月02日 17:13)

    Very enjoyed this! Well done!

  8. 8.градостроительный кодекс скачать(2011年09月12日 16:39)

    I now, this is a great article.A successful blog needs unique, useful content that interests the readers

  9. 9.купить солярий в Нижнем Новгороде(2011年09月20日 22:24)

    Good article. Very well written

  10. 10.Запчасти для радиоуправляемых моделей(2011年12月13日 18:39)

    Thank you very much for that great article

  11. 11.Экспертиза зданий и сооружений(2011年12月13日 19:26)

    Great article . Will definitely copy it to my website.

  12. 12.Скачать Искупление(2011年12月16日 17:34)

    useful information. It's really good

  13. 13.Opel Astra G аэродинамический обвес NTC Style(2011年12月31日 16:40)

    Great article . Will definitely apply it to my site

  14. 14.Стройотряд(2012年01月02日 00:41)

    Thank you very much for that dazzling article

  15. 15.стройка(2012年01月03日 04:24)

    Thank you very much for that great article

  16. 16.Зайцев+1 2 сезон(2012年01月05日 02:24)

    I hope this was a very interesting post thanks for writing it

  17. 17.галереи девушек(2012年01月06日 03:03)

    It's interesting to find how challenging the content side is for some

  18. 18.[url=http://500ok.ru/500ok-prognozov/]прогнозы на матчи бесплатно[/url](2012年01月06日 16:51)

    I agree, this is a great article.A successful blog needs unique, useful content that interests the readers

  19. 19.программы для взлома паролей вконтакте(2012年01月09日 00:12)

    Its very important

  20. 20.age of conan русский(2012年01月10日 15:06)

    I agree, this is a best article.A successful blog needs unique, useful content that interests the readers

  21. 21.Зов Дракона(2012年01月11日 17:31)

    Thank you very much for that dazzling article

  22. 22.Игра Три Богатыря и Шамаханская царица(2012年01月16日 04:21)

    Its very important

  23. 23.Микронаушник Нижний Новгород(2012年01月25日 18:17)

    Thank you very much for that superb article

  24. 24.теплоноситель производитель(2012年01月25日 22:34)

    Good article. Very well written

  25. 25.Многофункциональные измерительные приборы(2012年01月25日 23:45)

    what a lengthy and in depth article but full of useful information

  26. 26.Вода в офис Нижний Новгород(2012年01月26日 16:32)

    Thank you very much for that great article

  27. 27.администрирование web сайтов(2012年02月09日 22:30)

    Great article . Will definitely apply it to my site

  28. 28.[url=http://www.supersait.biz/seo.html]сео оптимизация сайта[/url](2012年02月12日 20:16)

    Good article, lots of intersting things to digest. Very informative

  29. 29.[url=http://www.supersait.biz/mitishi.html]мытищи продвижение сайтов[/url](2012年02月13日 10:08)

    I agree, this is a best article.A successful blog needs unique, useful content that interests the readers

  30. 30.бадан(2012年02月14日 12:44)

    Really enjoyed this! Well done!

  31. 31.хоста зимой(2012年02月15日 05:03)

    Astonishing article . Will definitely copy it to my blog.Thanks

この記事にコメントを書く

記事に対するテクニカルな質問はご遠慮ください(利用規約)。

トラックバック

この記事のトラックバックURL

http://f-site.org/mt3/mt-tb.cgi/585

その他の記事