`
lexsain
  • 浏览: 17641 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

安卓汉字转拼音

阅读更多
原来研究的小项目,现在简单整理了一下,免费贡献给大家!
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
0
0
分享到:
评论

相关推荐

    java汉字转拼音,android汉字转拼音,汉字转拼音首字母,汉字转ASCII

    以上就是关于“java汉字转拼音,android汉字转拼音,汉字转拼音首字母,汉字转ASCII”的技术要点。在实际应用中,根据需求选择合适的转换方式,并注意处理可能出现的异常情况,如多音字、非ASCII字符等。在处理大量...

    Android汉字转拼音例子

    在"Android汉字转拼音例子"中,开发者利用了一个第三方库来实现这个功能。接下来,我们将深入探讨这个主题。 1. **汉字与拼音的关系** 汉字是中国传统的书面文字,每个汉字都有其对应的拼音,拼音是汉字的拉丁化...

    android 汉字转拼音

    "android 汉字转拼音"是这样一个功能,它可以将中文字符转化为它们的拼音表示。在这个项目中,我们有两个核心文件:`HanziToPinyin.java`和`HanziToPinyinTest.java`。 `HanziToPinyin.java`通常包含一个类,这个类...

    android汉字转拼音

    这个“android汉字转拼音”项目正是为了解决这样的需求。它基于Android 4.2的源码进行提取,并且已经在Android 2.x和4.x版本上进行了测试,确保了兼容性。 在Android系统中,汉字转拼音的实现通常涉及到以下几个...

    android 汉字转拼音包

    "android 汉字转拼音包"正是一款专为此目的设计的工具。这个库可以帮助开发者轻松地处理汉字与拼音之间的转换,提高应用的用户体验,尤其是在进行模糊搜索、语音输入支持或者对非拉丁字母输入进行处理时。 在...

    Android汉字转拼音

    这里我们关注的焦点是“Android汉字转拼音”技术,这主要依赖于两个关键元素:`HanziToPinyin` 类和 `Pinyin4J.jar` 库。 `HanziToPinyin` 类通常是一个自定义实现,用于处理汉字到拼音的转换。这个类可能会包含一...

    Android 汉字转拼音

    基于 Android 原生 ICU 的库实现; 优点是简单,快捷; 缺点是仅支持 Android 4.3 及以上的系统。 主要就是从源码(Android 5.0)里拷贝 HanziToPinyin.java 和 Transliterator.java 这两个文件过来。 Android 旧版...

    Android汉字转拼音Demo

    这个"Android汉字转拼音Demo"就是这样一个示例项目,它演示了如何在Android应用中实现汉字到拼音的转换。这个过程通常涉及到第三方库的使用,本例中采用的是`pinyin4j.jar`。 `pinyin4j.jar`是一个Java库,专门用于...

    java安卓android汉字转拼音中文转拼音pinyin4j简化精简版

    java安卓android汉字转拼音中文转拼音pinyin4j简化精简版. 网上流传的有180KB,太大了,对于android开发来说。我精简了很多无关内容,收录常用汉字大约2万个,完全够用了,还专门写了一个helper类,直接调用这个...

    android 汉字转拼音应用

    "android 汉字转拼音应用"就是这样一个源码项目,它允许开发者将其打包成一个jar文件,用于其他Android项目的开发中。 这个应用的核心功能是将汉字转化为拼音,这在Android开发中是一项实用的技术。它通常涉及到...

    Android中文转拼音所用到的jar

    在这种情况下,"Android中文转拼音所用到的jar" 提供了必要的工具和库来实现这一功能。这个压缩包包含两个关键资源:`pinyin4j-2.5.0.jar` 和 `HanziToPinyin.java`。 1. **pinyin4j-2.5.0.jar**: `pinyin4j` 是一...

    安卓汉字转拼音项目工程代码列子

    总之,“安卓汉字转拼音项目工程代码列子”是一个帮助开发者掌握如何在Android应用中实现汉字转拼音功能的实践教程。通过pinyin4j库,开发者可以轻松地处理汉字与拼音之间的转换,提高应用的用户体验,尤其是在涉及...

    Android 汉字转拼音总结

    这个主题主要围绕Java在Android环境下的汉字转拼音技术进行阐述。 一、拼音转换基础 1. 汉字与拼音的关系:汉字是中国特有的文字,每个汉字都有对应的汉语拼音,是汉字的拉丁字母表示形式。拼音转换是将汉字转化为...

    Android实现汉字转拼音(支持多音)

    - Android系统本身并不直接提供汉字转拼音的API,但可以通过调用系统服务来间接实现。例如,可以利用InputMethodService或TextToSpeech服务,它们在处理输入或语音时,内部会进行汉字转拼音的转换。这种方式可能...

Global site tag (gtag.js) - Google Analytics