最近研究了一下haxe,发现蛮牛逼的,转几篇知识帖

haXe开发笔记:中文问题的小结

* .hx源文件中如果包含中文,要保存成UTF-8编码才能够正确被haXe编译器解析,是否包含BOM(Byte Order Marker, 在UTF-8文件中,为EF BB BF三个字节的固定值)无所谓。

* 采用Assets.getText()是可以正确载入包含中文的文本文件的,前提是文本文件要用UTF-8编码,另外UTF-8文本文件中不要包含BOM 否则在cpp等目标中,这个BOM也会被当做字符载入进来。

* Flash目标和Cpp目标的运行时字符串编码是不同的,因此包含中文的字符串长度在不同的目标中并非一致,这个千万要引起注意!

* Flash的运行时字符串编码应该是是Unicode,每个字符包括中文都是双字节,所以每个中文字符占1个长度;而windows/android等基于hxcpp的目标的内部编码则是ISO8859-1,因此Ascii字符占1个长度,而中文以UTF-8表示则占3个长度。也就是说:

"haXe爱好者".length == 7; // flash

"haXe爱好者".length == 13; // cpp, android etc. (= 4 + 3 * 3)

* 其实在cpp中想用GBK编码来表示中文也未尝不可,毕竟对中文来说GBK更节省内存。但如果想让TextField正确显示中文,则TextField.text属性中的中文必须是以UTF-8编码的,因此需要在调用前进行编码转换。

* 经测试,在neko和windows目标中(中文WindowsXP),如希望用trace()在控制台正确输出中文,则传入的字符串必须以GBK编码。因此,在你的程序中,你到底用何种编码表示中文,就要看你自己的取舍了。当然,搞一个UTF-8 <-> GBK转换也并非太困难的事情。

* 在Android手机中(小米实测),TextField如使用默认字体是显示不了中文的,因为从NME源代码分析,NME采用的默认字体是Times,并不包括中文。但可以在应用中自带中文TrueType字体,使用下面的方法来设置字体:

var fontSize = 24, fontColor = 0xFF0000;
myTextField.defaultTextFormat = new TextFormat(Assets.getFont("res/fangsong.ttf").fontName, fontSize, fontColor);
myTextField.embedFonts = true;

* 另外注意,经我测试,似乎TextField的text属性必须在defaultTextFormat属性之后进行赋值,否则自定义字体不生效。

* 另外某些低端Android手机(比如我的华为C8500)可能无法正常载入中文字体,可能是因为内存不够?这就没有办法了。

* 目前Neko目标在UI绘制中文暂时无解(也可能是我没找到),因此我暂时放弃neko了,改用windows目标代替。

前面写了篇关于中文显示的文章,地址在:http://hi.baidu.com/rockswang/item/7a6e5c283eb1190f42634acb

在Android平台上,上文给出的解决方案是应用自带中文字体。

但是这里有个问题就是中文字体文件普遍太大了,比如我找的仿宋字体算小的了,也有4M左右,而微软雅黑居然要14M,这样apk安装包就很大了。另外,经测试我的华为C8500低端手机上无法正常载入嵌入字体,可能是内存不够。

完美的解决方案当然就是使用Android的设备自带字体,但在以前的测试中,这似乎只对英文文本有效。

经读取NME源代码以及无数次真机验证,今天终于解决了这个问题。

方案的关键就在于:经研究,NME的Font类是可以访问本地文件系统中的字体的。而Android系统中的默认中文字体文件的路径是/system/fonts/DroidSansFallback.ttf。

此方案经验证亦可工作于C8500低端手机,因此堪称完美!

具体请看代码如下:

var tf = new TextField();

#if android

var format = new TextFormat(new Font("/system/fonts/DroidSansFallback.ttf").fontName);

#else

var format = new TextFormat();

#end

format.color = 0xFF0000;

format.size = 24;

tf.defaultTextFormat = format;

tf.text = "1234567890AbCdEfGh 看看:中文显示是否正常!m(^_*)$";

tf.height = 400;

tf.width = 400;

tf.multiline = true;

tf.wordWrap = true;

tf.selectable = false;

tf.x = 20;

tf.y = 30;

canvas.addChild(tf);

NME使用Android设备自带中文字体

经验证,在Android/Windows等目标平台上(iOS目前没条件测试),中文输入还是不行,TextField似乎仅接受Ascii字符。

今天在群中看到有位大侠找到了老外写的一篇文章解决了这个问题:http://www.haxenme.org/community/forums/general-discussion/patch-for-non-ascii-character-input-from-soft-keyboard-in-androi/

于是特意测试了一下,上面老外的原版补丁未能解决一次输入多个字符的问题,但是稍作修改即可成功输入中文了,而且像讯飞输入法之类的语音大段输入也没问题!目前看来已经没有什么东西能阻挡haXe制霸移动开发的步伐了,哇哈哈哈哈!

具体修改步骤如下:

1. 这次需要hack NME的Android模板文件了,具体路径如下:

<haXe安装目录>\lib\nme\<版本号>\tools\command-line\android\template\src\org\haxe\nme\MainView.java

2. 在MainView类中添加一个方法如下:

@Override
    public boolean onKeyMultiple(final int inKeyCode, int repeatCount, KeyEvent event) {
        String s = event.getCharacters();
        if (s == null || s.length() == 0) return super.onKeyMultiple(inKeyCode, repeatCount, event);
        final char[] cc = s.toCharArray();
        int cnt = 0;
        for (int i = cc.length; --i >= 0; cnt += cc[i] != 0 ? 1 : 0);
        if (cnt == 0) return super.onKeyMultiple(inKeyCode, repeatCount, event);
        final MainView me = this;
        queueEvent(new Runnable() {
            // This method will be called on the rendering thread:
            public void run() {
                for (int i = 0, n = cc.length; i < n; i++) {
                    int keyCode;
                    if ((keyCode = cc[i]) != 0) {
                        // Simulate key down and up...
                        me.HandleResult(NME.onKeyChange(keyCode, true));
                        me.HandleResult(NME.onKeyChange(keyCode, false));
                    }
                }
            }
        });
        return true;
    }

[转]NME Android目标中文输入问题完美解决!的更多相关文章

  1. AJAX中文乱码PHP完美解决(IE和Firefox兼容)

    最近在做一个项目,遇到AJAX中文乱码问题,经过一个下午的努力终于完美解决,现将心得写下来,希望对那些还困绕在这个问题而头痛不已的人们有所帮助. 众所周知,使用AJAX传送和接收中文参数时,如果不在客 ...

  2. linux(centos)无中文输入,如何解决

    1.终端执行安装命令 yum install "@Chinese Support" 2.如下图,多出Input method 3.点击进行配置 4.reboot重启系统,新建一个文 ...

  3. 单点登录(十六)-----遇到问题-----cas4.2.x登录成功后报错No principal was found---cas中文乱码问题完美解决

    情况 我们之前已经完成了cas4.2.x登录使用mongodb验证方式并且自定义了加密. 单点登录(十五)-----实战-----cas4.2.x登录mongodb验证方式实现自定义加密 但是悲剧的是 ...

  4. 遇到问题-----cas4.2.x登录成功后报错No principal was found---cas中文乱码问题完美解决

    情况 我们之前已经完成了cas4.2.x登录使用MongoDB验证方式并且自定义了加密. 单点登录(十五)-----实战-----cas4.2.x登录mongodb验证方式实现自定义加密 但是悲剧的是 ...

  5. Android输入法扩展之外接键盘中文输入

    大家想不想要这样一台Android  Surface平板,看着就过瘾吧. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSVRsZWFrcw==/font/ ...

  6. 完美解决 Linux 下 Sublime Text 中文输入

    首先,我参考了好几篇文章,都是蛮不错的,先列出来: sublime-text-imfix:首先推荐这个方法,最简单,但是在我的系统上有些问题.可用这个的强烈推荐用这个 完美解决 Linux 下 Sub ...

  7. Android EditText输入字数限制总结(包含中文输入内存溢出的解决方法)

    转载请注明,大飞:http://blog.csdn.net/rflyee/article/details/38856539 限定EditText输入个数的解决方式非常多,可是一般主要考虑两点.也就是处 ...

  8. Emacs下的中文输入

    Emacs如此优秀的编辑器,如果输入中文不顺畅,不免遗憾.可惜现实是折腾很久也未必用得称心如意,作为一个重度(也许是中毒) Emacs使用者,根据个人经验写下此文,希望对同道中人有所帮助. 在Wind ...

  9. 完美解决Informix的中文乱码问题

    完美解决Informix的中文乱码问题  Informix是IBM旗下的一款数据库,要不是这个项目需要,估计这辈子我都不知道居然还有这么一款数据库.想来公司的项目遍布全国各地,各种部署环境各种应用场景 ...

随机推荐

  1. 约瑟夫环的C语言数组实现

    约瑟夫环问题的具体描述是:设有编号为1,2,……,n的n个(n>0)个人围成一个圈,从第1个人开始报数,报到m时停止报数,报m的人出圈,才从他的下一个人起重新报数,报到m时停止报数,报m的出圈, ...

  2. String和StringBufffer的区别

    string的字符串操作都是废弃已有的对象,开辟一个新的内存空间创建一个新的对象 比如一个string str= "字符串"; str += "a"; 这样的操 ...

  3. STM32f103的电阻触摸屏的五点校正算法

    源:STM32f103的电阻触摸屏的五点校正算法 STM32f103的触摸屏的设置与使用

  4. 学习C#之旅 冒泡排序,选择排序,插入排序,希尔排序[资料收集]

    关于冒泡排序,选择排序,插入排序,希尔排序[资料收集]  以下资料来源与网络 冒泡排序:从后到前(或者从前到后)相邻的两个两两进行比较,不满足要求就位置进行交换,一轮下来选择出一个最小(或最大)的放到 ...

  5. copy deepcopy辨析

    copy deepcopy讲的是复制源对象的改变对copy出来的对象的影响: 我们寻常意义的复制就是深复制,即将被复制对象完全再复制一遍作为独立的新个体单独存在. 所以改变原有被复制对象不会对已经复制 ...

  6. 20145240 《Java程序设计》第四次实验报告

    20145240 <Java程序设计>第四次实验报告 北京电子科技学院(BESTI)实验报告 课程:Java程序设计 班级:1452 指导教师:娄嘉鹏 实验日期:2016.04.26 实验 ...

  7. linux中获取堆栈空间大小的方法

    #include   <stdio.h> #include   <stdlib.h> #include   <sys/time.h> #include   < ...

  8. JAVAWeb学习总结(一)

    一.基本概念 1.1.WEB开发的相关知识 WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. Internet上供外界访问的Web资源分为: 静态web资源( ...

  9. 服务器Windows 2008 R2 安装SQL 2008 R2

    在站点下载 SQL 2008 R2 在安装数据库之前首先安装IIS和.NET 3.5 解压  找到运行程序 (这里需要修改路径,数据库一般不要安装在系统盘) (选择任何一个都可以,这里选择system ...

  10. CCNA 课程 五

    VLSM (可变长子网掩码)也就是子网的划分过程 子网掩码和ip地址相与得到的是IP地址的网络地址(0&1 == 0 : 1&1 == 1) 简单来说就是 IP地址 和 子网掩码 上下 ...