자바 한자 병 음 가 져 오기
9657 단어 Java
package com.ricky.java.pinyin;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.concurrent.ConcurrentHashMap;
import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
public class PinyinUtils {
private static final ConcurrentHashMap duoYinMap = new ConcurrentHashMap(512);
public static final String pinyin_sep = "#";
public static final String word_sep = "/";
//
static{
BufferedReader br = null;
try {
InputStream in = PinyinUtils.class.getClassLoader().getResourceAsStream("duoyinzi_pinyin.txt");
br = new BufferedReader(new InputStreamReader(in,"UTF-8"));
String line = null;
while((line=br.readLine())!=null){
String[] arr = line.split(pinyin_sep);
if(StringUtils.isNotEmpty(arr[1])){
String[] sems = arr[1].split(word_sep);
for (String sem : sems) {
if(StringUtils.isNotEmpty(sem)){
duoYinMap.put(sem , arr[0]);
}
}
}
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
IOUtils.closeQuietly(br);
}
}
public static String[] chineseToPinYin(char chineseCharacter) throws BadHanyuPinyinOutputFormatCombination{
HanyuPinyinOutputFormat outputFormat = new HanyuPinyinOutputFormat();
outputFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
outputFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
outputFormat.setVCharType(HanyuPinyinVCharType.WITH_V);
if(chineseCharacter>=32 && chineseCharacter<=125){ //ASCII >=33 ASCII<=125 ,ASCII :http://www.asciitable.com/
return new String[]{String.valueOf(chineseCharacter)};
}
return PinyinHelper.toHanyuPinyinStringArray(chineseCharacter, outputFormat);
}
/**
* get chinese words pin yin
* @param chinese
* @param fullPy
* @return
* @throws BadHanyuPinyinOutputFormatCombination
*/
public static String getPinYin(String chinese, boolean fullPy) throws BadHanyuPinyinOutputFormatCombination{
if(StringUtils.isEmpty(chinese)){
return null;
}
char[] chs = chinese.toCharArray();
StringBuilder result = new StringBuilder(20);
for(int i=0;iif(arr==null || arr.length<1){
throw new RuntimeException("not find pin yin for:"+chs[i]);
}
if(arr.length==1){
result.append(fullPy ? arr[0]:arr[0].charAt(0));
}else if(arr[0].equals(arr[1])){
result.append(fullPy ? arr[0]:arr[0].charAt(0));
}else{
String prim = chinese.substring(i, i+1);
String lst = null,rst = null;
if(i<=chinese.length()-2){
rst = chinese.substring(i,i+2);
}
if(i>=1 && i+1<=chinese.length()){
lst = chinese.substring(i-1,i+1);
}
String answer = null;
for (String py : arr) {
if(StringUtils.isEmpty(py)){
continue;
}
if((lst!=null && py.equals(duoYinMap.get(lst))) ||
(rst!=null && py.equals(duoYinMap.get(rst)))){
answer = py;
break;
}
if(py.equals(duoYinMap.get(prim))){
answer = py;
}
}
if(StringUtils.isEmpty(answer)){
throw new RuntimeException("not find pin yin for:"+chs[i]);
}
result.append(fullPy ? answer:answer.charAt(0));
}
}
return result.toString().toLowerCase();
}
}
전체 원본 다운로드:https://github.com/TiFG/py4j
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.