字符集学习笔记(二)

本文详细阐述了在创建角色昵称文本框时,如何根据不同需求选择合适的字符集,并通过事件监听实现输入限制,确保输入符合预期。文章重点介绍了如何在使用UTF-8编码的情况下,限制中文与英文字符的输入数量,同时提供了实例代码演示。

参考http://www.discuz.net/thread-407264-1-1.html

一、如何选择字符集:

1.如果你所在地区是大陆实用简体字的地方,且不打算考虑外国朋友的浏览要求,可以考虑实用GBK编码。

2.如果有对外(国)的需要,或者英文比较多的论坛,或者论坛中可能会有相当大部分的英文字符(比如经常交流代码的),可以选择UTF-8编码:UTF-8编码的文字可以在各国各种支持UTF8字符集的浏览器上显示。比如,如果是UTF8编码,则在外国人的英文IE上也能显示中文,而无需他们下载IE的中文语言支持包。使用GBK则每个字符占用2个字节,而使用UTF-8英文却只占一个字节。通用性较强。但是相对来说比GBK占用空间大。

3.如果身边环境为繁体字语言(或者电脑的使用习惯,操作平台),那就选择BIG5编码好了。

 

二、一个实际应用的例子:

要求:创建角色昵称文本框,后端使用utf-8存储。我们希望限制输入字符数,中文6个,英文字符18个。

 

方式1.使用maxChars属性

txt_name.maxChars = 6;

这样中文最多输入六个,英文也是最多六个字符。

 

方式2.使用字符集长度判断

StringUtil.as:

/**

 * 根据制定字符集获取字符串的实际字符数

 * @param str

 * @param charSet 指定计算的编码方式。默认gb2312编码,一个汉字算2个字符,如果是utf-8编码,则一个汉字算3个字符

 * @return

 */

static public function getStringCharLength(str:String, charSet:String = "gb2312"):uint

{

var bytes:ByteArray = new ByteArray();

bytes.writeMultiByte(str, charSet);

return bytes.length;

}

 

剩下的事情就是使用文本框TextField的两个事件:Event.CHANGE 和TextEvent.TEXT_INPUT,区别如下:

 

在文本框中输入文本时要执行一系统运行,这些运行依次为:触发TEXT_INPUT事件--显示输入的内容--触发CHANGE事件。

TEXT_INPUT事件对象有一个属性text,其中包含了事件发生时输入到文本框中的字符或字符序列。注意text属性中的内容只包括当前事件发生时输入的字符,不同于文本框对象的text属性。比如先输入a,那么event.text = a。继续输入b,那么event.text = b,而不是ab。

 

Event.CHANGE 和TextEvent.TEXT_INPUT 都是用户修改值调度,两者的主要区别是一前一后, Event.CHANGE 是在文本被改变之后调度,TextEvent.TEXT_INPUT是在文本将要加入前调度。另外,删除已经输入的字符会触发Event.CHANGE,但不会触发TextEvent.TEXT_INPUT。

 

在文本键入前拦截有很多好处,比如我们希望文本框只能输入数字和字母,当用户键入非法字符时给予警告或提示,当然你可以使用正则,使用restrict属性来限定,可是这样提示信息就会很难处理。

txt.addEventListener(TextEvent.TEXT_INPUT,inputHandler)

function inputHandler(event:TextEvent){

        var reg:RegExp=/[^0-9A-Za-z]/g        

        if(reg.test(event.text)){

                event.preventDefault() 

                trace("非法字符:"+ event.text)

        }

}

比如打字练习软件,不允许使用粘贴,只需要象下面这样,无论右键的粘贴,还是Ctrl+V,都可以有效拦截.(指的是大量的文本的粘贴)其它功能还有很多...

txt.addEventListener(TextEvent.TEXT_INPUT,inputHandler)

function inputHandler(event:TextEvent){        

        if(event.text.length>1)//如果练习的是中文4-8就差不多了

                event.preventDefault()         

}

 

现在看我们自己的需求实现:

txt_name.addEventListener(TextEvent.TEXT_INPUT,onTextInput);

private function onTextInput(event:TextEvent):void

{

if(StringTool.getStringCharLength(txt_name.text) > 18){

event.preventDefault();

}

}

结果:汉字是六个,但英文却可以输入19个。侦听事件发现,在第一次输入英文字符时,虽然触发了TextEvent.TEXT_INPUT事件,但txt_name.text仍然为空,理由在上面解释得清楚,TextEvent.TEXT_INPUT是在文本将要加入前调度的,这时txt_name.text还取不到。那么将判断条件改成>= 18会如何呢,结果是英文可以输入18个,但汉字的第六个却无法输入。这真是个奇怪的问题,目前猜测是由汉字输入法造成的。最后的修正办法是使用Event.CHANGE处理的

maxChars = 18;

txt_name.addEventListener(Event.CHANGE, inputHandler);

private function inputHandler(evt:Event):void

{

var newStr:String = txt_input.text;

if (StringTool.getStringCharLength(newStr) > maxChars){

while (StringTool.getStringCharLength(newStr) > maxChars){

newStr = newStr.substring(0, newStr.length - 1);

}

txt_input.text = newStr;

}

}

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值