我希望,也相信,这样的问题以后绝对不会遇上,研究这样的问题事实上也没有多大的意义,写给大家,因为我体会到了研究的快乐。
flash lite2.0就已经能正常显示中文了,但是我用fl2.1输出了一个发短信的程序,竟然怎么都没办法往文本框里输入正常显示的中文,这简直让人无法忍受。
我曾经退缩过,这肯定是flash lite player的问题,关我什么事?
但是不行,我制作了一个简单的程序在onChanged事件里输出输入字符的对应编码,看看到底是mobile输入法的问题,还是汉字编码的问题。
msg.onChanged=function(tf:TextField){
var s:String=tf.text;
for(var i:int;i<s.length;i++){
tf.text+=s.charAt(i)+"+"+s.charCodeAt(i)+"\n";
}
}
在emulator上一点问题都没有,在windows mobile上问题就来了:
正常输入“你”返回20320;
在mobile上用双拼输入,显示正常,正常返回;
但是用手写输入,结果如下:
显示:乱码 数值:0:79; 1:96; 2:13
一次输入得到3个字符,经过分析,是手写输入的问题,windows mobile将unicode字符拆成两个拉丁字符
[quote]20320换成16进制:0x4F60
79 ->0x4F 96 ->0x60 [/quote]
,然后还顺带一个13->'\n'
我们搞明白了,win mobile是这样一个机制,它并不完全彻底的支持unicode编码,而是用一个凑活的办法,两个字节后面加上一个'\n'就代表一个双字节字符
native app当然没有问题,可以直接捕获用户输入,但是flash lite player是一个独立的程序,它没有办法处理。
于是有了下面的代码
msg.onChanged = function(tf:TextField) {
if (tf.text.length>s.length) {
if ((tf.length-s.length)>2) {
var s:String = tf.text;
s = s.slice(0, s.length-3);
var a:Number = tf.text.charCodeAt(tf.length-2);
var b:Number = tf.text.charCodeAt(tf.length-1);
a <<= 8;
a += b;
s += String.fromCharCode(a);
tf.text = s;
}
}
};
分析用户输入,当一下子连续输入3个字节,就把最后一个字符处理成unicode.
我们以为这样的程序能够后期处理用户的输入,但是我们错了,在PC上onChanged事件几乎是TextField内的文字一发生改变,就立刻触发
而mobile上不是,是只有当用户把焦点移走才能触发onChanged事件,所以最后证明上面的代码没有任何意义。
现在唯一的解决办法就是:setInterval,但是这个办法不但消耗资源,而且可能引发更大的混乱。
真希望flash lite 3里没有这种问题,onChanged事件能供用户输入时立刻触发。
回复Comments
作者:
{commentrecontent}