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