Flash AS3 二维码生成工具

老早就想做一个功能比较全面的二维码工具,发现ZXing库还是比较全的,AS3的库也有,就用Flash做了一个,效果展示:

初步的功能其实还好,但问题就卡在编码上,生成出来的汉字扫出来就是 ?? ,这肯定是编码问题,于是对ZXing(AS3)编码流程仔细地检查,发现有一步编码中没有将编码参数传入,于是里面使用了默认的 iso-8859-1 的编码。原来加上参数就好了。

//文件:com\google\zxing\qrcode\QRCodeWriter.as 63
Encoder.encode(contents, errorCorrectionLevel, code);

//修改
Encoder.encode(contents, errorCorrectionLevel, code, hints);

 

解决了编码问题,解码问题又来了,发现生成的二维码中的汉字,解码出来全是莫名其妙的符号(不是问号),我很熟悉这些符号,就是编辑器使用iso-8859-1字符集打开utf-8文档中看到的汉字部分。还是编码问题,但这次麻烦大了,不只是个参数问题,而是解码算法,原代码是直接读一个字节,就转换String,而没有像编码中那样用Flash的ByteArray中的方法,经过反复测试,只需要将转换的部分改成写入一个ByteArray,最后使用ByteArray的readMultiByte的方法传入设置的编码就好了。

//文件:com\google\zxing\qrcode\decoder\DecodedBitStreamParser
//修改方法
private static function decodeByteSegment(bits:BitSource, result:StringBuilder, count:int, currentCharacterSetECI:CharacterSetECI, byteSegments:ArrayList, hints:HashTable):void
		{
			// Don't crash trying to read more bits than we have available.
			if (count << 3 > bits.available())
			{
				throw FormatException.getFormatInstance();
			}
			
			var encoding:String = 'iso-8859-1';
			if (hints.containsKey(DecodeHintType.CHARACTER_SET)) {
				encoding = String(hints.getValueByKey(DecodeHintType.CHARACTER_SET));
			}
			
			var readBytes:Array = new Array(count);
			var bytes:ByteArray = new ByteArray();
			var bit:int;
			for (var i:int = 0; i < count; i++)
			{
				bit = bits.readBits(8);
				bytes.writeByte(bit);
				readBytes[i] = String.fromCharCode(bit);
			}
			bytes.position = 0;
			result.Append(bytes.readMultiByte(bytes.length,encoding));
			byteSegments.addElement(readBytes);
		}

 源码下载:http://pan.baidu.com/s/1qWzcpkw  提取密码:gi23