本文转自http://l4cd.net/blog/post-old-139.html, 如需转载或引用请标明作者和出处。
//Copyright © 2009. Http://L4cd.Net All Rights Reserved. package net.L4cd.display { import flash.events.Event; import flash.events.TextEvent; import flash.text.TextField; import flash.utils.ByteArray; /** * 扩展TextField类,中文以2字符长度计算 * * @author L4cd.Net * @playerversion Flash player 9 * @langversion 3.0 * @version 2009-06-16 */ public class TextFieldExt extends TextField { private var _maxChars:int = -1; public function TextFieldExt() { super(); } override public function get maxChars():int { return _maxChars; } override public function set maxChars(value:int):void { _maxChars = value; if(maxChars<0) { removeEventListener(TextEvent.TEXT_INPUT,input); }else { addEventListener(TextEvent.TEXT_INPUT,input); text = getTextByCharLength(text,maxChars); } } override public function get length():int { return getCharLength(text); } private function input(e:TextEvent):void { //拦截并阻止textinput事件,手动处理内容输入 var textField:TextField = e.currentTarget as TextField; var temp:String = getTextByCharLength(e.text,maxChars - getCharLength(text) + getCharLength(selectedText)); var index:int = selectionBeginIndex; replaceText(selectionBeginIndex,selectionEndIndex,temp); setSelection(index+temp.length,index+temp.length); dispatchEvent(new Event(Event.CHANGE,true)); e.preventDefault(); } /** * 获取字符长度,一个中文算2长度 * @param txt * @return 返回长度值 */ private function getCharLength(txt:String):int { var byte:ByteArray = new ByteArray(); byte.writeMultiByte(txt,"gb2312"); byte.position = 0; return byte.bytesAvailable; } /** * 截取指定长度的文本内容,一个中文算2长度 * @param txt 需要截取的文本 * @param length 需要截取的长度 * @return 截取后的内容 */ private function getTextByCharLength(txt:String,length:int):String { if(length<1)return ""; var byte:ByteArray = new ByteArray(); byte.writeMultiByte(txt,"gb2312"); byte.position = 0; return byte.readMultiByte(Math.min(length,byte.bytesAvailable),"gb2312"); } } }