- 浏览: 579036 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (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 1182原来的游戏是用js实现的: http://www.kikya ... -
突然觉得不能太依赖模拟器加速
2012-08-19 08:02 902以前就怀疑过Android模拟器的加速,不过jkanji接二连 ... -
Markdown语法学习笔记
2012-08-18 20:47 1906一、文本效果: # h1标题 # ,或#h1标题,或h ... -
再次脱线的Tomoe酱
2012-08-15 09:42 1010之前移植了libspark的Tomoe(原版是用AS2 ... -
OpenGL ES与libgdx学习笔记一:二维坐标系方向变换
2012-08-02 13:16 3499二维坐标系变换为原点在左上角(测试用) * GLES ... -
尝试把Danmaku的SurfaceView移植版移植到libgdx
2012-07-11 17:56 1197测试结果是可行的,帧率可以很大,竟然可以在间隔高于60fps ... -
jkanji 3.x开发展望
2012-06-23 06:35 770首先,我最希望能改善一下用户界面。 其次,是我最想说的(如果 ... -
制作STG游戏的初步构思
2012-06-20 18:13 1363计划第二个游戏是做STG题材的游戏,内容未定(我首先想到的是叉 ... -
Android Platform 3.0 SDK和Eclipse ADT安装记录六
2012-06-19 06:32 1298一、弹幕射击游戏相关项目和网址 1. Danm ... -
ReversiWins预览版截图
2012-06-06 09:44 911今天完成ReversiWins预览版的全部工作了。接下来是添加 ... -
SQLite的全文搜索与符号化问题
2012-06-01 08:35 286520130213更正: 下面的'"明 日 *& ... -
用git下载Android自带app的源代码
2012-05-29 11:19 8351(1) 创建工作目录,创建并切换本地的master分 ... -
关于日语简易词典的svn仓库的一点说明
2012-05-24 15:15 957日语简易词典(jkanji)是我写的一个Android平台的小 ... -
脱线的tomoe手写输入
2012-05-24 12:09 993最近想把日语简易词典的手写功能完善一下,发现一些问题: 1. ... -
Android Platform 3.0 SDK和Eclipse ADT安装记录五
2012-05-11 21:32 1380目录: 一、在Aptana 3 ... -
SQLite学习笔记
2012-05-07 21:05 7470SQLite学习笔记 (未完成,待修改) ... -
KAS代码阅读
2012-05-03 17:36 1016(未完成,待修改) KAS 0.4.3 [201 ... -
ZipFile.getInputStream()的read方法和AudioTrack中的write方法
2012-04-28 11:06 1822最近发现Java的InputStream是一个很诡异的抽象类, ... -
cocos2d-x for Android安装和学习笔记(请用adt-bundle21.1或以上导入)
2012-04-11 18:10 11871(20121108)注意:这篇文章用cdt编译ndk工程的 ... -
使用HAXM加速的Android x86模拟器(和一些问题)
2012-04-09 23:26 13612装了个Android SDK r17, ...
相关推荐
在项目中使用ICU4C,通常需要通过链接器将ICU库链接到你的程序中,并且在源代码中包含对应的头文件。例如,如果需要使用字符串操作,可以这样引入: ```cpp #include ``` 然后就可以使用ICU提供的API进行操作了。...
3. 头文件(h文件):定义了ICU4C的API,供开发者在自己的项目中调用。 4. 数据文件:可能包含Unicode数据,如字符映射表、区域设置信息等。 5. 示例和测试代码:帮助开发者理解如何使用ICU4C库进行实际开发。 总的...
ICU4C,全称是International Components for Unicode for C,是一个强大的开源库,主要用于处理Unicode字符集和全球化的任务。这个“icu4c-4_8-Win32-msvc10”压缩包包含了ICU4.8版本在Windows 32位平台上,使用...
接着,通过包含头文件来引入ICU4C的API。例如,如果需要进行字符串转换,可以使用`#include <unicode/unistr.h>`。然后,可以调用如`UnicodeString`类的方法来处理字符串。同时,为了运行时支持,32位应用需要链接32...
在这个场景中,尽管标签中提到了cmake,但在描述中并未直接提到其使用,但可以推断,在实际的编译流程中,用户可能需要使用cmake来集成icu4c库到Tesseract项目中。 【压缩包子文件的文件名称列表】中仅列出了"icu...
Python和Java的使用方式类似,都是通过对应语言的API调用mecab的分词功能。 在获取每个词条的详细信息时,可以使用parseToNode方法,它返回句首的特殊词条,该词条是一个双向链表的节点,通过next和prev属性可以...
在Android平台上进行中文分词是移动应用开发中的一个重要环节,特别是在处理用户输入、搜索功能或者进行文本分析时。本文将详细解析"Android中文分词 2.2以上真机测试成功"这一主题,涵盖相关技术点及其实现过程。 ...
在icu.net中,您将找到与ICU4C的C ++类相对应的类。 尽管不是严格要求,但建议在应用程序的开始处调用Icu.Wrapper.Init() 。 这将允许从多个线程使用icu.net(参见)。 同样,退出之前调用Icu.Wrapper.Cleanup()...
android通过USB外接摄像头这是一个例子,通过C调用底层驱动。在网上找过了例子总出现select timeout异常,改造解决了。有问题可以发邮件505738005.
要通过反射调用加载和卸载外置SD卡,我们需要访问Android系统的私有API,因为这些操作不在官方的SDK中公开。具体来说,我们关注的核心类是`MountService`,它是负责设备挂载和卸载的核心组件。 1. **`IMountService...
【Qt on Android调用Jar包】是一个重要的技术实践,它涉及到跨平台开发和Java与C++的交互。在Android平台上,Qt提供了一种强大的方式来创建原生应用程序,但有时我们可能需要集成已经存在的Java库(以.jar文件形式)...
总之,Android中的WebView与JavaScript的交互是通过暴露Java对象和调用JavaScript函数实现的,这种方式极大地丰富了Android应用的功能。在实际开发中,我们需要合理利用这一特性,同时注意安全性和性能优化。
通过以上步骤,我们就成功地在Android应用中调用了第三方.so库。需要注意的是,由于.so库可能依赖其他库,因此在部署到不同设备时,需要确保包含了所有必要的库。同时,为了提高应用的兼容性和性能,需要针对不同的...
本文将深入探讨如何在Android应用中通过Java接口调用OpenCV 2.4版本,以实现将图片转换为灰度图的功能。 首先,我们需要理解OpenCV的基本概念。OpenCV(Open Source Computer Vision Library)是一个跨平台的计算机...
让我们深入探讨如何在QT中通过QProcess调用外部可执行程序并将其嵌入到主窗口中。 首先,了解QProcess的基本用法。QProcess允许我们启动一个外部进程,监控它的状态,读取其标准输出和错误输出,甚至可以向进程发送...
在Android平台上,调用系统自带的录音机是开发者经常遇到的需求,这可以帮助用户方便地录制音频并集成到应用中。本文将深入探讨如何在Android应用中实现这一功能,并结合"AutoRecoder"这个示例来讲解相关知识点。 ...
调用时,通过Unity的DllImport函数调用Android插件的方法,从而执行Android端的功能。 本Demo中的“中间件”可能是实现这种交互的关键组件。它可能是一个封装了调用逻辑的库,帮助简化Android和Unity3D之间的通信...
在Android开发中,调用Web Service接口是常见的数据交互方式,尤其在实现用户登录功能时。Web Service通常采用SOAP或RESTful API的形式提供服务,允许客户端应用程序(如Android应用)发送请求并接收响应。本教程将...
android USB调用摄像头,经过半月时间终于搞定了, 在网上找了好多,还有日文注释的 希望段友多多包涵,首先手机支持uvc 测试机 荣耀8. 我也是在网上找啊找,如何谁在学习接触这方面,共同学习,
在Android平台上进行Qt开发时,有时我们需要调用C++库来扩展功能,这些...通过以上步骤,你应该能够在Qt for Android项目中成功地调用静态库和动态库。记得在开发过程中进行充分的测试,确保在不同设备上都能正常运行。