ByteArray に 'unicode' を書き込む際のバグ

by minodisk forked from ByteArray に 'unicodeFFFE' を書き込む際のバグ (diff: 8)
♥0 | Line 82 | Modified 2010-05-11 14:15:28 | MIT License
play

ActionScript3 source code

/**
 * Copyright minodisk ( http://wonderfl.net/user/minodisk )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/elWo
 */

// forked from ferv's ByteArray に 'unicodeFFFE' を書き込む際のバグ
package
{
	import flash.display.Sprite;
	import flash.system.Capabilities;
	import flash.text.TextField;
	import flash.text.TextFieldAutoSize;
	import flash.text.TextFormat;
	import flash.utils.ByteArray;
	
	[SWF(width="465", height="465", backgroundColor="0xFFFFFF", frameRate="30")]
	public class Unicode extends Sprite
	{
		private var _textField:TextField;
		
		public function Unicode()
		{
			_textField = new TextField();
			_textField.x = 10;
			_textField.y = 10;
			_textField.width = 445;
			_textField.height = 445;
			_textField.wordWrap = true;
			_textField.defaultTextFormat = new TextFormat('_sans', 16, 0x333333, true);
			addChild(_textField);
			
			_check('わんだwonderふる');
		}
		
		private function _check(text:String):void
		{
			var i:int, length:int;
			
			var bytes0:ByteArray = new ByteArray();
			bytes0.writeMultiByte(text, 'unicode');
			bytes0.position = 0;
			
			var bytes1:ByteArray = new ByteArray();
			_writeUnicode(bytes1, text);
			bytes1.position = 0;
			
			var code0:String = '';
			length = bytes0.length / 2;
			for (i = 0; i < length; i ++)
			{
				code0 += 'U+' + _toHexString(bytes0.readUnsignedShort()).toUpperCase() + ' ';
			}
			
			var code1:String = '';
			length = bytes1.length / 2;
			for (i = 0; i < length; i ++)
			{
				code1 += 'U+' + _toHexString(bytes1.readUnsignedShort()).toUpperCase() + ' ';
			}
			
			_textField.text = '"' + text + '" というテキストをデフォルトのメソッドとバグ対応済みのメソッドで utf-16 BE として ByteArray に書き込むテスト' + '\r' +
			                          '\r' +
			                          '- writeMultibyte を使った場合 (バグ有り)' + '\r' +
			                          '     bytes0.length = ' + bytes0.length.toString() + '\r' +
			                          '     code0 = ' + code0 + '\r' +
			                          '\r' +
			                          '- writeShort/writeUnsignedInt を使った場合 (バグ対応)' + '\r' +
			                          '     bytes1.length = ' + bytes1.length.toString() + '\r' +
			                          '     code1 = ' + code1 + '\r' +
			                          '\r' +
			                          'Capabilities.version = ' + Capabilities.version;
		}

		private function _writeUnicode(bytes:ByteArray, text:String):void
		{
			var length:int = text.length;
			var charCode:int;
			for (var i:int = 0; i < length; i ++)
			{
				charCode = text.charCodeAt(i);
				if (charCode < 0x10000)
					bytes.writeShort((charCode & 0xff) << 8 | (charCode & 0xff00) >> 8);
				else
					bytes.writeUnsignedInt((charCode & 0xff) << 24 | (charCode & 0xff00) << 8 | (charCode & 0xff0000) >> 8 | (charCode & 0xff000000) >> 24);
			}
		}
		
		private function _toHexString(value:int, length:int = 2):String
		{
			var hex:String = value.toString(16);
			while (hex.length < length * 2)
			{
				hex = '0' + hex;
			}
			trace(hex);
			return hex;
		}
	}
}