- 浏览: 559199 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (338)
- 已过时文章(留念用) (39)
- Android学习笔记 (30)
- Android开发指引自译 (100)
- Android NDK文档自译 (23)
- Android设计指引自译 (2)
- xp(ペケピー)&linux(理奈、铃)酱~ (4)
- ui酱&歌词自译~ (9)
- lua酱~ (9)
- 自我反省 (1)
- 羽game计划 (1)
- XSL酱 (2)
- java酱 (3)
- 设计的领悟 (58)
- 涂鸦作品(pixiv) (1)
- ruby酱 (2)
- Objective-C编程语言自译 (2)
- Android开发月报 (6)
- objc酱 (2)
- photoshop (3)
- js酱 (6)
- cpp酱 (8)
- antlr酱 (7)
- Lua 5.1参考手册自译 (11)
- 收藏品 (3)
- 待宵草计划 (4)
- 体验版截图 (1)
最新评论
-
naruto60:
太给力了!!!!我这网打不开Intel官网,多亏楼主贴了连接, ...
使用HAXM加速的Android x86模拟器(和一些问题) -
yangyile2011:
谢谢博主,翻译得很好哦
【翻译】(4)片段 -
ggwang:
牙痛的彼岸:痹!
牙痛的彼岸 -
ggwang:
总结得很简练清晰啊,学习了!
ANTLR学习笔记一:概念理解 -
leisurelife1990:
mk sdd
用git下载Android自带app的源代码
通过BreakIterator调用Android的icu4c执行中日文的粗略“分词”
- 博客分类:
- Android学习笔记
发现Android自带的icu4c可以直接使用,不需要自己编译它。它的JNI接口可以用java.text包下的类间接调用。
我感兴趣的是icu4c的范围分析功能,即所谓的分词,例如,可以用java.text.BreakIterator实现日文和中文粗略分词(前提是需要事先指定其语言区域,不过后来实测发现日文的分词效果并不如专门的分词库那么好)。官方文档中有一个使用示例,用起来也非常方便:
package com.iteye.weimingtom.icutest; import java.text.BreakIterator; import java.util.Locale; import android.app.Activity; import android.os.Bundle; public class ICUTestActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); final String testStr = "残忍で破壊的な性格がチャームポイントな本作の主人公[6][7]。" + "真尋にひと目惚れし、それ以来、" + "下心を隠そうともせず猛アタックを続けている。"; System.out.println("日文范围划分"); test(Locale.JAPAN, testStr); System.out.println("中文范围划分"); test(Locale.CHINA, testStr); /* 08-15 19:05:24.825: I/System.out(9011): 日文范围划分 08-15 19:05:24.835: I/System.out(9011): 残忍 08-15 19:05:24.835: I/System.out(9011): で 08-15 19:05:24.845: I/System.out(9011): 破壊的 08-15 19:05:24.845: I/System.out(9011): な 08-15 19:05:24.845: I/System.out(9011): 性格 08-15 19:05:24.845: I/System.out(9011): が 08-15 19:05:24.845: I/System.out(9011): チャームポイント 08-15 19:05:24.845: I/System.out(9011): な 08-15 19:05:24.845: I/System.out(9011): 本作 08-15 19:05:24.845: I/System.out(9011): の 08-15 19:05:24.845: I/System.out(9011): 主人公 08-15 19:05:24.845: I/System.out(9011): [ 08-15 19:05:24.845: I/System.out(9011): 6 08-15 19:05:24.845: I/System.out(9011): ] 08-15 19:05:24.855: I/System.out(9011): [ 08-15 19:05:24.855: I/System.out(9011): 7 08-15 19:05:24.855: I/System.out(9011): ] 08-15 19:05:24.855: I/System.out(9011): 。 08-15 19:05:24.855: I/System.out(9011): 真尋 08-15 19:05:24.855: I/System.out(9011): にひと 08-15 19:05:24.855: I/System.out(9011): 目惚 08-15 19:05:24.855: I/System.out(9011): れし 08-15 19:05:24.865: I/System.out(9011): 、 08-15 19:05:24.865: I/System.out(9011): それ 08-15 19:05:24.865: I/System.out(9011): 以来 08-15 19:05:24.865: I/System.out(9011): 、 08-15 19:05:24.865: I/System.out(9011): 下心 08-15 19:05:24.865: I/System.out(9011): を 08-15 19:05:24.865: I/System.out(9011): 隠 08-15 19:05:24.865: I/System.out(9011): そうともせず 08-15 19:05:24.865: I/System.out(9011): 猛 08-15 19:05:24.865: I/System.out(9011): アタック 08-15 19:05:24.865: I/System.out(9011): を 08-15 19:05:24.865: I/System.out(9011): 続 08-15 19:05:24.865: I/System.out(9011): けている 08-15 19:05:24.865: I/System.out(9011): 。 08-15 19:05:24.865: I/System.out(9011): 中文范围划分 08-15 19:05:24.885: I/System.out(9011): 残 08-15 19:05:24.885: I/System.out(9011): 忍 08-15 19:05:24.885: I/System.out(9011): で 08-15 19:05:24.885: I/System.out(9011): 破 08-15 19:05:24.885: I/System.out(9011): 壊 08-15 19:05:24.885: I/System.out(9011): 的 08-15 19:05:24.885: I/System.out(9011): な 08-15 19:05:24.885: I/System.out(9011): 性 08-15 19:05:24.885: I/System.out(9011): 格 08-15 19:05:24.885: I/System.out(9011): が 08-15 19:05:24.885: I/System.out(9011): チャームポイント 08-15 19:05:24.885: I/System.out(9011): な 08-15 19:05:24.885: I/System.out(9011): 本 08-15 19:05:24.885: I/System.out(9011): 作 08-15 19:05:24.885: I/System.out(9011): の 08-15 19:05:24.885: I/System.out(9011): 主 08-15 19:05:24.885: I/System.out(9011): 人 08-15 19:05:24.885: I/System.out(9011): 公 08-15 19:05:24.885: I/System.out(9011): [ 08-15 19:05:24.885: I/System.out(9011): 6 08-15 19:05:24.885: I/System.out(9011): ] 08-15 19:05:24.885: I/System.out(9011): [ 08-15 19:05:24.885: I/System.out(9011): 7 08-15 19:05:24.885: I/System.out(9011): ] 08-15 19:05:24.885: I/System.out(9011): 。 08-15 19:05:24.885: I/System.out(9011): 真 08-15 19:05:24.885: I/System.out(9011): 尋 08-15 19:05:24.885: I/System.out(9011): に 08-15 19:05:24.885: I/System.out(9011): ひ 08-15 19:05:24.885: I/System.out(9011): と 08-15 19:05:24.885: I/System.out(9011): 目 08-15 19:05:24.895: I/System.out(9011): 惚 08-15 19:05:24.895: I/System.out(9011): れ 08-15 19:05:24.895: I/System.out(9011): し 08-15 19:05:24.895: I/System.out(9011): 、 08-15 19:05:24.895: I/System.out(9011): そ 08-15 19:05:24.895: I/System.out(9011): れ 08-15 19:05:24.895: I/System.out(9011): 以 08-15 19:05:24.905: I/System.out(9011): 来 08-15 19:05:24.905: I/System.out(9011): 、 08-15 19:05:24.905: I/System.out(9011): 下 08-15 19:05:24.905: I/System.out(9011): 心 08-15 19:05:24.905: I/System.out(9011): を 08-15 19:05:24.905: I/System.out(9011): 隠 08-15 19:05:24.905: I/System.out(9011): そ 08-15 19:05:24.905: I/System.out(9011): う 08-15 19:05:24.905: I/System.out(9011): と 08-15 19:05:24.905: I/System.out(9011): も 08-15 19:05:24.905: I/System.out(9011): せ 08-15 19:05:24.905: I/System.out(9011): ず 08-15 19:05:24.905: I/System.out(9011): 猛 08-15 19:05:24.905: I/System.out(9011): アタック 08-15 19:05:24.905: I/System.out(9011): を 08-15 19:05:24.905: I/System.out(9011): 続 08-15 19:05:24.905: I/System.out(9011): け 08-15 19:05:24.905: I/System.out(9011): て 08-15 19:05:24.915: I/System.out(9011): い 08-15 19:05:24.915: I/System.out(9011): る 08-15 19:05:24.915: I/System.out(9011): 。 */ } /** * @see http://developer.android.com/reference/java/text/BreakIterator.html * @param where * @param stringToExamine */ private static void test(Locale where, String stringToExamine) { BreakIterator boundary = BreakIterator.getWordInstance(where); boundary.setText(stringToExamine); int start = boundary.first(); for (int end = boundary.next(); end != BreakIterator.DONE; start = end, end = boundary.next()) { System.out.println(stringToExamine.substring(start, end)); } } }
PS:可能缺少一些区域,需要事先作判断。
boolean hasJapanLocal = false; Locale[] locales = BreakIterator.getAvailableLocales(); if (locales != null) { for (Locale locale : locales) { if (D) { Log.d(TAG, "locale: " + locale.toString()); } if (locale != null && locale.equals(Locale.JAPAN)) { hasJapanLocal = true; break; } } }
参考资料:
1. Android官方文档
http://developer.android.com/reference/java/text/BreakIterator.html
2. icu4c的官方文档
http://userguide.icu-project.org/boundaryanalysis
3. Android源代码中的测试代码
4. chrome使用的开源工程介绍
http://my.oschina.net/yaraja/blog/32521
发表评论
-
移植js弹幕游戏到libgdx
2012-08-20 10:45 1131原来的游戏是用js实现的: http://www.kikya ... -
突然觉得不能太依赖模拟器加速
2012-08-19 08:02 856以前就怀疑过Android模拟器的加速,不过jkanji接二连 ... -
Markdown语法学习笔记
2012-08-18 20:47 1859一、文本效果: # h1标题 # ,或#h1标题,或h ... -
再次脱线的Tomoe酱
2012-08-15 09:42 963之前移植了libspark的Tomoe(原版是用AS2 ... -
OpenGL ES与libgdx学习笔记一:二维坐标系方向变换
2012-08-02 13:16 3429二维坐标系变换为原点在左上角(测试用) * GLES ... -
尝试把Danmaku的SurfaceView移植版移植到libgdx
2012-07-11 17:56 1154测试结果是可行的,帧率可以很大,竟然可以在间隔高于60fps ... -
jkanji 3.x开发展望
2012-06-23 06:35 730首先,我最希望能改善一下用户界面。 其次,是我最想说的(如果 ... -
制作STG游戏的初步构思
2012-06-20 18:13 1299计划第二个游戏是做STG题材的游戏,内容未定(我首先想到的是叉 ... -
Android Platform 3.0 SDK和Eclipse ADT安装记录六
2012-06-19 06:32 1212一、弹幕射击游戏相关项目和网址 1. Danm ... -
ReversiWins预览版截图
2012-06-06 09:44 871今天完成ReversiWins预览版的全部工作了。接下来是添加 ... -
SQLite的全文搜索与符号化问题
2012-06-01 08:35 281220130213更正: 下面的'"明 日 *& ... -
用git下载Android自带app的源代码
2012-05-29 11:19 8201(1) 创建工作目录,创建并切换本地的master分 ... -
关于日语简易词典的svn仓库的一点说明
2012-05-24 15:15 925日语简易词典(jkanji)是我写的一个Android平台的小 ... -
脱线的tomoe手写输入
2012-05-24 12:09 946最近想把日语简易词典的手写功能完善一下,发现一些问题: 1. ... -
Android Platform 3.0 SDK和Eclipse ADT安装记录五
2012-05-11 21:32 1322目录: 一、在Aptana 3 ... -
SQLite学习笔记
2012-05-07 21:05 7364SQLite学习笔记 (未完成,待修改) ... -
KAS代码阅读
2012-05-03 17:36 939(未完成,待修改) KAS 0.4.3 [201 ... -
ZipFile.getInputStream()的read方法和AudioTrack中的write方法
2012-04-28 11:06 1771最近发现Java的InputStream是一个很诡异的抽象类, ... -
cocos2d-x for Android安装和学习笔记(请用adt-bundle21.1或以上导入)
2012-04-11 18:10 11795(20121108)注意:这篇文章用cdt编译ndk工程的 ... -
使用HAXM加速的Android x86模拟器(和一些问题)
2012-04-09 23:26 13489装了个Android SDK r17, ...
相关推荐
C++调用Android函数工程Demo详情见博客
在Android中调用二进制可执行程序,无须在init.rc中增加services
在icu.net中,您将找到与ICU4C的C ++类相对应的类。 尽管不是严格要求,但建议在应用程序的开始处调用Icu.Wrapper.Init() 。 这将允许从多个线程使用icu.net(参见)。 同样,退出之前调用Icu.Wrapper.Cleanup()...
Unity调用Android相册,获取到图片,在Unity中调用Android原生应用。
本单元实现了一个伪的Shell,可以用于在Android程序中执行Shell命令,如果需要Root权限,则在执行前,调用AskForRoot方法来获取用户的Root授权,如果不再需要在Root账号下执行命令,则调用ExitRoot方法来退出Root...
JS调用Android Native API,在webview中通过js代码调用本地的java代码,比如:可以通过网页中的js代码调用android的音频服务播放音乐等等
JavaScript调用Android方法,向Android方法传递json数据。
H5 调用android本地相机进行拍照,支持android 5.0, 6.0等操作系统,均已适配;
android和js互相调用,并且可以传参数。
android通过USB外接摄像头这是一个例子,通过C调用底层驱动。在网上找过了例子总出现select timeout异常,改造解决了。有问题可以发邮件505738005.
这个代码是配合博客写的,是一个关于html5调用android的列子
Unity 调用Android文件资源管理器,可以选择Android手机上的图片,视频等一些列文件,并且获得相关的文件路径。直接导入Unity即可运行。测试已经通过
网上看了好多android下调用脚本的例子,在没有root的情况下,大多只能执行一些简单的脚本命令,经验证,总结出一种还算比较有用的方法,可以较多数脚本,算是比较靠谱,共享下
android使用webView实现java程序与js脚本的相互调用,
unity调用Android Api实现短信发送和震动功能
包里有完整的代码整合到项目中可以直接使用,主要是通过webview的js调用Android中的方法来实现js和Android的交互功能
uniapp调用原生Android SDK ,uniapp调用原生IOS SDK, uniapp 调用原生安卓sdkdemo
android js 互相调用 android js 互相调用 android js 互相调用 android js 互相调用 android js 互相调用 android js 互相调用 android js 互相调用
基于PicoVR Unity SDK实现调用Android系统PowerManager类相关的功能 Unity调用Android系统PowerManager类功能
演示如何在Qt on Android应用中通过JNI调用第三方Jar包