- 浏览: 17752 次
- 性别:
- 来自: 武汉
最新评论
原来研究的小项目,现在简单整理了一下,免费贡献给大家!
package com.tool.hz2py;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.TextView;
public class MainActivity extends Activity {
protected Hz2py hz2py;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
hz2py = new Hz2py();
TextView view = (TextView) findViewById(R.id.text);
view.setText(hz2py.hz2py("汉字转拼音"));
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
#include "hz2py.h"
#include <string.h>
#include "com_tool_hz2py_Hz2py.h"
#define HZ2PY_UTF8_CHECK_LENGTH 20
#define HZ2PY_FILE_READ_BUF_ARRAY_SIZE 1000
#define HZ2PY_INPUT_BUF_ARRAY_SIZE 1024
#define HZ2PY_OUTPUT_BUF_ARRAY_SIZE 2048
#define HZ2PY_STR_COPY(to, from, count) \
ok = 1;\
i = 0;\
_tmp = from;\
while(i < count)\
{\
if (*_tmp == '\0')\
{\
ok = 0;\
break;\
}\
_tmp ++;\
i ++;\
}\
if (ok)\
{\
i = 0;\
while(i < count)\
{\
*to = *from;\
to ++;\
from ++;\
i ++;\
}\
}\
else\
{\
if (overage_buff != NULL)\
{\
while(*from != '\0')\
{\
*overage_buff = *from;\
from ++;\
}\
}\
break;\
}
//将utf8编码的字符串中的汉字解成拼音
// in 输入
// out 输出
// first_letter_only 是否只输出拼音首字母
// polyphone_support 是否输出多音字
// add_blank 是否在拼音之间追加空格
// convert_double_char 是否转换全角字符为半角字符
// overage_buff 末尾如果有多余的不能组成完整utf8字符的字节,将写到overage_buff,传NULL将输出到out
void utf8_to_pinyin(char *in, char *out, int first_letter_only,
int polyphone_support, int add_blank, int convert_double_char,
char *overage_buff) {
int i = 0;
char *utf = in;
char *_tmp;
char *_tmp2;
char py_tmp[30] = "";
char py_tmp2[30] = "";
char *out_start_flag = out;
int uni;
int ok = 0;
while (*utf != '\0') {
if ((*utf >> 7) == 0) {
HZ2PY_STR_COPY(out, utf, 1);
//如果为一个字节加上#号分隔
*out = '#'; //用#号做为分隔符
out++;
//去掉其它的英文只留汉字
//只能搜索到汉字拼音里面字母
// out--;
// *out = ' ';
}
//两个字节
else if ((*utf & 0xE0) == 0xC0) {
HZ2PY_STR_COPY(out, utf, 2);
}
//三个字节
else if ((*utf & 0xF0) == 0xE0) {
if (*(utf + 1) != '\0' && *(utf + 2) != '\0') {
uni = (((int) (*utf & 0x0F)) << 12)
| (((int) (*(utf + 1) & 0x3F)) << 6)
| (*(utf + 2) & 0x3F);
if (uni > 19967 && uni < 40870) {
memset(py_tmp, '\0', 30);
memset(py_tmp2, '\0', 30);
strcpy(py_tmp, _pinyin_table_[uni - 19968]);
_tmp = py_tmp;
_tmp2 = py_tmp2;
if (first_letter_only == 1) {
*_tmp2 = *_tmp;
_tmp++;
_tmp2++;
while (*_tmp != '\0') {
if (*_tmp == '|' || *(_tmp - 1) == '|') {
*_tmp2 = *_tmp;
_tmp2++;
}
_tmp++;
}
} else {
strcpy(py_tmp2, py_tmp);
}
_tmp2 = py_tmp2;
if (polyphone_support == 0) {
while (*_tmp2 != '\0') {
if (*_tmp2 == '|') {
*_tmp2 = '\0';
break;
}
_tmp2++;
}
_tmp2 = py_tmp2;
}
strcpy(out, _tmp2);
out += strlen(_tmp2);
if (add_blank) {
*out = '#'; //用#号做为分隔符
out++;
}
utf += 3;
} else if (convert_double_char && uni > 65280 && uni < 65375) {
*out = uni - 65248;
out++;
utf += 3;
} else if (convert_double_char && uni == 12288) {
*out = 32;
out++;
utf += 3;
} else {
HZ2PY_STR_COPY(out, utf, 3);
}
} else {
HZ2PY_STR_COPY(out, utf, 3);
}
}
//四个字节
else if ((*utf & 0xF8) == 0xF0) {
HZ2PY_STR_COPY(out, utf, 4);
}
//五个字节
else if ((*utf & 0xFC) == 0xF8) {
HZ2PY_STR_COPY(out, utf, 5);
}
//六个字节
else if ((*utf & 0xFE) == 0xFC) {
HZ2PY_STR_COPY(out, utf, 6);
} else {
if (overage_buff != NULL) {
*overage_buff = *utf;
overage_buff++;
} else {
HZ2PY_STR_COPY(out, utf, 1);
}
break;
}
}
}
//判断一个字符串是否为utf8编码
int is_utf8_string(char *utf) {
int length = strlen(utf);
int check_sub = 0;
int i = 0;
if (length > HZ2PY_UTF8_CHECK_LENGTH) {
length = HZ2PY_UTF8_CHECK_LENGTH;
}
for (; i < length; i++) {
if (check_sub == 0) {
if ((utf[i] >> 7) == 0) {
continue;
} else if ((utf[i] & 0xE0) == 0xC0) {
check_sub = 1;
} else if ((utf[i] & 0xF0) == 0xE0) {
check_sub = 2;
} else if ((utf[i] & 0xF8) == 0xF0) {
check_sub = 3;
} else if ((utf[i] & 0xFC) == 0xF8) {
check_sub = 4;
} else if ((utf[i] & 0xFE) == 0xFC) {
check_sub = 5;
} else {
return 0;
}
} else {
if ((utf[i] & 0xC0) != 0x80) {
return 0;
}
check_sub--;
}
}
return 1;
}
int hztpy(const char *read_buff, char *outbuf) {
char overage_buff[7] = { 0 };
char *_tmp = NULL;
char inbuf[HZ2PY_INPUT_BUF_ARRAY_SIZE] = { 0 };
int add_blank = 1;
int polyphone_support = 1;
int first_letter_only = 0;
int convert_double_char = 0;
// first_letter_only 是否只输出拼音首字母
// polyphone_support 是否输出多音字
// add_blank 是否在拼音之间追加空格
// convert_double_char 是否转换全角字符为半角字符
// overage_buff 末尾如果有多余的不能组成完整utf8字符的字节,将写到overage_buff,传NULL将输出到out
_tmp = inbuf;
if (strlen(overage_buff)) {
strcpy(_tmp, overage_buff);
_tmp += strlen(overage_buff);
memset(overage_buff, '\0', 7);
}
strcpy(_tmp, read_buff);
if (!is_utf8_string(inbuf)) {
return -1;
}
utf8_to_pinyin(inbuf, outbuf, first_letter_only, polyphone_support,
add_blank, convert_double_char, overage_buff);
return 1;
}
JNIEXPORT jstring JNICALL Java_com_tool_hz2py_Hz2py_hz2py(JNIEnv *env,
jobject thiz, jstring text) {
const char* pText = env->GetStringUTFChars(text, 0);
char* oText = new char[512];//256中文
memset(oText,0,512);
hztpy(pText,oText);
jstring returnText = env->NewStringUTF(oText);
env->ReleaseStringUTFChars(text,pText);
delete oText;
return returnText;
}
代码格式显示不出来,郁闷.请大家移步这里看代码吧!
IT十万为什么 » http://www.ithtw.com/37.html
package com.tool.hz2py;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.TextView;
public class MainActivity extends Activity {
protected Hz2py hz2py;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
hz2py = new Hz2py();
TextView view = (TextView) findViewById(R.id.text);
view.setText(hz2py.hz2py("汉字转拼音"));
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
#include "hz2py.h"
#include <string.h>
#include "com_tool_hz2py_Hz2py.h"
#define HZ2PY_UTF8_CHECK_LENGTH 20
#define HZ2PY_FILE_READ_BUF_ARRAY_SIZE 1000
#define HZ2PY_INPUT_BUF_ARRAY_SIZE 1024
#define HZ2PY_OUTPUT_BUF_ARRAY_SIZE 2048
#define HZ2PY_STR_COPY(to, from, count) \
ok = 1;\
i = 0;\
_tmp = from;\
while(i < count)\
{\
if (*_tmp == '\0')\
{\
ok = 0;\
break;\
}\
_tmp ++;\
i ++;\
}\
if (ok)\
{\
i = 0;\
while(i < count)\
{\
*to = *from;\
to ++;\
from ++;\
i ++;\
}\
}\
else\
{\
if (overage_buff != NULL)\
{\
while(*from != '\0')\
{\
*overage_buff = *from;\
from ++;\
}\
}\
break;\
}
//将utf8编码的字符串中的汉字解成拼音
// in 输入
// out 输出
// first_letter_only 是否只输出拼音首字母
// polyphone_support 是否输出多音字
// add_blank 是否在拼音之间追加空格
// convert_double_char 是否转换全角字符为半角字符
// overage_buff 末尾如果有多余的不能组成完整utf8字符的字节,将写到overage_buff,传NULL将输出到out
void utf8_to_pinyin(char *in, char *out, int first_letter_only,
int polyphone_support, int add_blank, int convert_double_char,
char *overage_buff) {
int i = 0;
char *utf = in;
char *_tmp;
char *_tmp2;
char py_tmp[30] = "";
char py_tmp2[30] = "";
char *out_start_flag = out;
int uni;
int ok = 0;
while (*utf != '\0') {
if ((*utf >> 7) == 0) {
HZ2PY_STR_COPY(out, utf, 1);
//如果为一个字节加上#号分隔
*out = '#'; //用#号做为分隔符
out++;
//去掉其它的英文只留汉字
//只能搜索到汉字拼音里面字母
// out--;
// *out = ' ';
}
//两个字节
else if ((*utf & 0xE0) == 0xC0) {
HZ2PY_STR_COPY(out, utf, 2);
}
//三个字节
else if ((*utf & 0xF0) == 0xE0) {
if (*(utf + 1) != '\0' && *(utf + 2) != '\0') {
uni = (((int) (*utf & 0x0F)) << 12)
| (((int) (*(utf + 1) & 0x3F)) << 6)
| (*(utf + 2) & 0x3F);
if (uni > 19967 && uni < 40870) {
memset(py_tmp, '\0', 30);
memset(py_tmp2, '\0', 30);
strcpy(py_tmp, _pinyin_table_[uni - 19968]);
_tmp = py_tmp;
_tmp2 = py_tmp2;
if (first_letter_only == 1) {
*_tmp2 = *_tmp;
_tmp++;
_tmp2++;
while (*_tmp != '\0') {
if (*_tmp == '|' || *(_tmp - 1) == '|') {
*_tmp2 = *_tmp;
_tmp2++;
}
_tmp++;
}
} else {
strcpy(py_tmp2, py_tmp);
}
_tmp2 = py_tmp2;
if (polyphone_support == 0) {
while (*_tmp2 != '\0') {
if (*_tmp2 == '|') {
*_tmp2 = '\0';
break;
}
_tmp2++;
}
_tmp2 = py_tmp2;
}
strcpy(out, _tmp2);
out += strlen(_tmp2);
if (add_blank) {
*out = '#'; //用#号做为分隔符
out++;
}
utf += 3;
} else if (convert_double_char && uni > 65280 && uni < 65375) {
*out = uni - 65248;
out++;
utf += 3;
} else if (convert_double_char && uni == 12288) {
*out = 32;
out++;
utf += 3;
} else {
HZ2PY_STR_COPY(out, utf, 3);
}
} else {
HZ2PY_STR_COPY(out, utf, 3);
}
}
//四个字节
else if ((*utf & 0xF8) == 0xF0) {
HZ2PY_STR_COPY(out, utf, 4);
}
//五个字节
else if ((*utf & 0xFC) == 0xF8) {
HZ2PY_STR_COPY(out, utf, 5);
}
//六个字节
else if ((*utf & 0xFE) == 0xFC) {
HZ2PY_STR_COPY(out, utf, 6);
} else {
if (overage_buff != NULL) {
*overage_buff = *utf;
overage_buff++;
} else {
HZ2PY_STR_COPY(out, utf, 1);
}
break;
}
}
}
//判断一个字符串是否为utf8编码
int is_utf8_string(char *utf) {
int length = strlen(utf);
int check_sub = 0;
int i = 0;
if (length > HZ2PY_UTF8_CHECK_LENGTH) {
length = HZ2PY_UTF8_CHECK_LENGTH;
}
for (; i < length; i++) {
if (check_sub == 0) {
if ((utf[i] >> 7) == 0) {
continue;
} else if ((utf[i] & 0xE0) == 0xC0) {
check_sub = 1;
} else if ((utf[i] & 0xF0) == 0xE0) {
check_sub = 2;
} else if ((utf[i] & 0xF8) == 0xF0) {
check_sub = 3;
} else if ((utf[i] & 0xFC) == 0xF8) {
check_sub = 4;
} else if ((utf[i] & 0xFE) == 0xFC) {
check_sub = 5;
} else {
return 0;
}
} else {
if ((utf[i] & 0xC0) != 0x80) {
return 0;
}
check_sub--;
}
}
return 1;
}
int hztpy(const char *read_buff, char *outbuf) {
char overage_buff[7] = { 0 };
char *_tmp = NULL;
char inbuf[HZ2PY_INPUT_BUF_ARRAY_SIZE] = { 0 };
int add_blank = 1;
int polyphone_support = 1;
int first_letter_only = 0;
int convert_double_char = 0;
// first_letter_only 是否只输出拼音首字母
// polyphone_support 是否输出多音字
// add_blank 是否在拼音之间追加空格
// convert_double_char 是否转换全角字符为半角字符
// overage_buff 末尾如果有多余的不能组成完整utf8字符的字节,将写到overage_buff,传NULL将输出到out
_tmp = inbuf;
if (strlen(overage_buff)) {
strcpy(_tmp, overage_buff);
_tmp += strlen(overage_buff);
memset(overage_buff, '\0', 7);
}
strcpy(_tmp, read_buff);
if (!is_utf8_string(inbuf)) {
return -1;
}
utf8_to_pinyin(inbuf, outbuf, first_letter_only, polyphone_support,
add_blank, convert_double_char, overage_buff);
return 1;
}
JNIEXPORT jstring JNICALL Java_com_tool_hz2py_Hz2py_hz2py(JNIEnv *env,
jobject thiz, jstring text) {
const char* pText = env->GetStringUTFChars(text, 0);
char* oText = new char[512];//256中文
memset(oText,0,512);
hztpy(pText,oText);
jstring returnText = env->NewStringUTF(oText);
env->ReleaseStringUTFChars(text,pText);
delete oText;
return returnText;
}
代码格式显示不出来,郁闷.请大家移步这里看代码吧!
IT十万为什么 » http://www.ithtw.com/37.html
发表评论
-
MultiSlidingDrawer多方向抽屉导航
2015-03-16 16:29 901项目需求很复杂,各种要求。官方的drawerlayout和开 ... -
分享两本android电子书
2015-03-09 16:46 1663Android 3D游戏开发技术宝典(PDF教程下载) ... -
编写自己的Adapter模板
2015-03-06 14:19 991如果你项目一直用系统给你封装的BaseAdapter的话,那 ... -
三国杀 JAVA源码(可移植Android平台)
2015-03-04 17:35 1342JAVA源码网盘下载:http://pan.baidu.c ... -
android应用斗地主
2015-03-02 18:55 374斗地主是纸牌游戏。关于阶级斗争详见土地改革运动。 斗地主是一 ... -
Android应用基于XMPP的仿微信
2015-03-02 18:53 672基于XMPP的微客服的项目源码,本站之前也介绍过一个微 ... -
高仿QQ界面(无通信)
2015-03-02 15:02 898本项目是一个高仿QQ最新版本的项目,界面超级华丽,使用了大量 ... -
MVP在安卓(Android)整理
2015-02-27 16:29 532前言 MVP作为一种MVC的 ... -
安卓手机QQ红点拖拽消除的实现
2015-02-20 10:02 1571新版手机QQ5.+上新增了 ... -
优化 Android ListView 异步加载图片
2015-02-18 10:55 788先说说这篇文章的优点把,开启线程异步加载图片,然后刷新UI显 ... -
Android增量升级简单实现,附源码
2015-01-19 15:47 715随着现在手机硬件不断 ... -
Android使用AIDL跨进程数据共享
2015-01-16 13:44 1723AIDL:Android Interface Defi ...
相关推荐
以上就是关于“java汉字转拼音,android汉字转拼音,汉字转拼音首字母,汉字转ASCII”的技术要点。在实际应用中,根据需求选择合适的转换方式,并注意处理可能出现的异常情况,如多音字、非ASCII字符等。在处理大量...
在"Android汉字转拼音例子"中,开发者利用了一个第三方库来实现这个功能。接下来,我们将深入探讨这个主题。 1. **汉字与拼音的关系** 汉字是中国传统的书面文字,每个汉字都有其对应的拼音,拼音是汉字的拉丁化...
"android 汉字转拼音"是这样一个功能,它可以将中文字符转化为它们的拼音表示。在这个项目中,我们有两个核心文件:`HanziToPinyin.java`和`HanziToPinyinTest.java`。 `HanziToPinyin.java`通常包含一个类,这个类...
这个“android汉字转拼音”项目正是为了解决这样的需求。它基于Android 4.2的源码进行提取,并且已经在Android 2.x和4.x版本上进行了测试,确保了兼容性。 在Android系统中,汉字转拼音的实现通常涉及到以下几个...
"android 汉字转拼音包"正是一款专为此目的设计的工具。这个库可以帮助开发者轻松地处理汉字与拼音之间的转换,提高应用的用户体验,尤其是在进行模糊搜索、语音输入支持或者对非拉丁字母输入进行处理时。 在...
这里我们关注的焦点是“Android汉字转拼音”技术,这主要依赖于两个关键元素:`HanziToPinyin` 类和 `Pinyin4J.jar` 库。 `HanziToPinyin` 类通常是一个自定义实现,用于处理汉字到拼音的转换。这个类可能会包含一...
基于 Android 原生 ICU 的库实现; 优点是简单,快捷; 缺点是仅支持 Android 4.3 及以上的系统。 主要就是从源码(Android 5.0)里拷贝 HanziToPinyin.java 和 Transliterator.java 这两个文件过来。 Android 旧版...
这个"Android汉字转拼音Demo"就是这样一个示例项目,它演示了如何在Android应用中实现汉字到拼音的转换。这个过程通常涉及到第三方库的使用,本例中采用的是`pinyin4j.jar`。 `pinyin4j.jar`是一个Java库,专门用于...
java安卓android汉字转拼音中文转拼音pinyin4j简化精简版. 网上流传的有180KB,太大了,对于android开发来说。我精简了很多无关内容,收录常用汉字大约2万个,完全够用了,还专门写了一个helper类,直接调用这个...
"android 汉字转拼音应用"就是这样一个源码项目,它允许开发者将其打包成一个jar文件,用于其他Android项目的开发中。 这个应用的核心功能是将汉字转化为拼音,这在Android开发中是一项实用的技术。它通常涉及到...
在这种情况下,"Android中文转拼音所用到的jar" 提供了必要的工具和库来实现这一功能。这个压缩包包含两个关键资源:`pinyin4j-2.5.0.jar` 和 `HanziToPinyin.java`。 1. **pinyin4j-2.5.0.jar**: `pinyin4j` 是一...
总之,“安卓汉字转拼音项目工程代码列子”是一个帮助开发者掌握如何在Android应用中实现汉字转拼音功能的实践教程。通过pinyin4j库,开发者可以轻松地处理汉字与拼音之间的转换,提高应用的用户体验,尤其是在涉及...
这个主题主要围绕Java在Android环境下的汉字转拼音技术进行阐述。 一、拼音转换基础 1. 汉字与拼音的关系:汉字是中国特有的文字,每个汉字都有对应的汉语拼音,是汉字的拉丁字母表示形式。拼音转换是将汉字转化为...
- Android系统本身并不直接提供汉字转拼音的API,但可以通过调用系统服务来间接实现。例如,可以利用InputMethodService或TextToSpeech服务,它们在处理输入或语音时,内部会进行汉字转拼音的转换。这种方式可能...