android實現(xiàn)漢字轉拼音功能 帶多音字識別
android 漢字轉拼音帶多音字識別功能,供大家參考,具體內容如下
問題來源
在做地名按首字母排序的時候出現(xiàn)了這樣一個bug。長沙會被翻譯拼音成zhangsha,重慶會被翻譯拼音成zhong qing。于是排序出了問題。
漢字轉拼音庫和多音字識別庫
1.多音字對應的詞匯庫
2.文字的二進制大小對應的拼音庫
關鍵代碼
1.我在這里首先將要轉化的文字轉化成對應的”gb2312”編碼。漢字轉化成二進制編碼一般占兩個字節(jié),如果一個字節(jié)返回字符,如果是兩個字節(jié)算一下偏移量。代碼如下
/** * 漢字轉成ASCII碼 * * @param chs * @return */
private int getChsAscii(String chs) {
int asc = 0;
try {
byte[] bytes = chs.getBytes("gb2312");
if (bytes == null || bytes.length > 2 || bytes.length <= 0) {
throw new RuntimeException("illegal resource string");
}
if (bytes.length == 1) {
asc = bytes[0];
}
if (bytes.length == 2) {
int hightByte = 256 + bytes[0];
int lowByte = 256 + bytes[1];
asc = (256 * hightByte + lowByte) - 256 * 256;
}
} catch (Exception e) {
System.out.println("ERROR:ChineseSpelling.class-getChsAscii(String chs)" + e);
}
return asc;
}
2.將單個漢字獲取的拼音再和多音字庫的hashMap進行比較,代碼如下:
public String getSellingWithPolyphone(String chs){
if(polyphoneMap != null && polyphoneMap.isEmpty()){
polyphoneMap = initDictionary();
}
String key, value, resultPy = null;
buffer = new StringBuilder();
for (int i = 0; i < chs.length(); i++) {
key = chs.substring(i, i + 1);
if (key.getBytes().length >= 2) {
value = (String) convert(key);
if (value == null) {
value = "unknown";
}
} else {
value = key;
}
resultPy = value;
String left = null;
if(i>=1 && i+1 <= chs.length()){
left = chs.substring(i-1,i+1);
if(polyphoneMap.containsKey(value) && polyphoneMap.get(value).contains(left)){
resultPy = value;
}
}
// if(chs.contains("重慶")){
String right = null; //向右多取一個字,例如 [長]沙
if(i<=chs.length()-2){
right = chs.substring(i,i+2);
if(polyphoneMap.containsKey(right)){
resultPy = polyphoneMap.get(right);
}
}
// }
String middle = null; //左右各多取一個字,例如 龍[爪]槐
if(i>=1 && i+2<=chs.length()){
middle = chs.substring(i-1,i+2);
if(polyphoneMap.containsKey(value) && polyphoneMap.get(value).contains(middle)){
resultPy = value;
}
}
String left3 = null; //向左多取2個字,如 羋月[傳],列車長
if(i>=2 && i+1<=chs.length()){
left3 = chs.substring(i-2,i+1);
if(polyphoneMap.containsKey(value) && polyphoneMap.get(value).contains(left3)){
resultPy = value;
}
}
String right3 = null; //向右多取2個字,如 [長]孫無忌
if(i<=chs.length()-3){
right3 = chs.substring(i,i+3);
if(polyphoneMap.containsKey(value) && polyphoneMap.get(value).contains(right3)){
resultPy = value;
}
}
buffer.append(resultPy);
}
return buffer.toString();
}
3.將asserts文件內容解析生成HashMap列表.
public HashMap<String, String> initDictionary(){
String fileName = "py4j.dic";
InputStreamReader inputReader = null;
BufferedReader bufferedReader = null;
HashMap<String, String> polyphoneMap = new HashMap<String, String>();
try{
inputReader = new InputStreamReader(MyApplication.mContext.getResources().getAssets().open(fileName),"UTF-8");
bufferedReader = new BufferedReader(inputReader);
String line = null;
while((line = bufferedReader.readLine()) != null){
String[] arr = line.split(PINYIN_SEPARATOR);
if(isNotEmpty(arr[1])){
String[] dyzs = arr[1].split(WORD_SEPARATOR);
for(String dyz: dyzs){
if(isNotEmpty(dyz)){
polyphoneMap.put(dyz.trim(),arr[0]);
}
}
}
}
}catch(Exception e){
e.printStackTrace();
}finally{
if(inputReader != null){
try {
inputReader.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(bufferedReader != null){
try {
bufferedReader.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return polyphoneMap;
}
github源碼下載:https://github.com/loveburce/ChinesePolyphone.git
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
- Android實現(xiàn)中文按拼音排序方法
- Android實現(xiàn)ListView的A-Z字母排序和過濾搜索功能 實現(xiàn)漢字轉成拼音
- android仿微信通訊錄搜索示例(匹配拼音,字母,索引位置)
- Android開發(fā)實現(xiàn)的IntentUtil跳轉多功能工具類【包含視頻、音頻、圖片、攝像頭等操作功能】
- android實用工具類分享(獲取內存/檢查網絡/屏幕高度/手機分辨率)
- android開發(fā)教程之實現(xiàn)toast工具類
- 19個Android常用工具類匯總
- android 一些工具類匯總
- Android7.0 工具類:DiffUtil詳解
- 非常實用的Android圖片工具類
- Android開發(fā)之拼音轉換工具類PinyinUtils示例
相關文章
android與asp.net服務端共享session的方法詳解
這篇文章主要給大家介紹了關于android與asp.net服務端如何共享session的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋們下面隨著小編來一起學習學習下吧。2017-09-09
AndroidStudio3 支持 Java8 了請問你敢用嗎
Google 發(fā)布了 AS 3.0,以及一系列的 Support 包,有意思的新東西挺多,AS3里面有一個亮眼的特性就是支持J8。接下來通過本文給大家分享AndroidStudio3 支持 Java8 的相關內容,感興趣的朋友一起看看吧2017-11-11
Android開發(fā) 旋轉屏幕導致Activity重建解決方法
Android開發(fā)文檔上專門有一小節(jié)解釋這個問題。簡單來說,Activity是負責與用戶交互的最主要機制,接下來為您詳細介紹2012-11-11
Android中ViewPager的PagerTabStrip與PagerTitleStrip用法實例
這篇文章主要介紹了Android中ViewPager的PagerTabStrip與PagerTitleStrip用法實例,這兩個子控件一般被用作添加標題,在實際效果上并不是那么好控制,使用的時候需要謹慎,需要的朋友可以參考下2016-06-06

