1 changed files with 204 additions and 0 deletions
@ -0,0 +1,204 @@ |
|||
package com.yxt.common.base.utils; |
|||
|
|||
import lombok.AllArgsConstructor; |
|||
import lombok.Data; |
|||
import org.apache.commons.lang3.StringUtils; |
|||
|
|||
import java.util.ArrayList; |
|||
import java.util.HashMap; |
|||
import java.util.List; |
|||
import java.util.Map; |
|||
|
|||
/** |
|||
* @Author dimengzhe |
|||
* @Date 2022/9/28 15:54 |
|||
* @Description |
|||
*/ |
|||
public class HanZiConverterPinYin { |
|||
|
|||
public HanZiConverterPinYin() { |
|||
// 初始化汉字拼音字母对照表
|
|||
initChinesePinyinComparisonMapList(); |
|||
} |
|||
|
|||
/** |
|||
* 汉字拼音字母对照表 |
|||
*/ |
|||
private List<ChinesePinyinComparisonMap> chinesePinyinComparisonMapList; |
|||
|
|||
/** |
|||
* 初始化汉字拼音字母对照表 |
|||
*/ |
|||
private void initChinesePinyinComparisonMapList() { |
|||
chinesePinyinComparisonMapList = new ArrayList<ChinesePinyinComparisonMap>(); |
|||
|
|||
chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-20319, -20284, 'A')); |
|||
chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-20283, -19776, 'B')); |
|||
chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-19775, -19219, 'C')); |
|||
chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-19218, -18711, 'D')); |
|||
chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-18710, -18527, 'E')); |
|||
chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-18526, -18240, 'F')); |
|||
chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-18239, -17923, 'G')); |
|||
chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-17922, -17418, 'H')); |
|||
chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-17417, -16475, 'J')); |
|||
chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-16474, -16213, 'K')); |
|||
chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-16212, -15641, 'L')); |
|||
chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-15640, -15166, 'M')); |
|||
chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-15165, -14923, 'N')); |
|||
chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-14922, -14915, 'O')); |
|||
chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-14914, -14631, 'P')); |
|||
chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-14630, -14150, 'Q')); |
|||
chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-14149, -14091, 'R')); |
|||
chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-14090, -13319, 'S')); |
|||
chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-13318, -12839, 'T')); |
|||
chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-12838, -12557, 'W')); |
|||
chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-12556, -11848, 'X')); |
|||
chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-11847, -11056, 'Y')); |
|||
chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-11055, -10247, 'Z')); |
|||
} |
|||
|
|||
/** |
|||
* 遍历获取首字母 |
|||
*/ |
|||
public char getPY(char c) throws Exception { |
|||
byte[] bytes = String.valueOf(c).getBytes("GBK"); |
|||
|
|||
//双字节汉字处理
|
|||
if (bytes.length == 2) { |
|||
|
|||
int hightByte = 256 + bytes[0]; |
|||
int lowByte = 256 + bytes[1]; |
|||
int asc = (256 * hightByte + lowByte) - 256 * 256; |
|||
|
|||
// 遍历转换
|
|||
for (ChinesePinyinComparisonMap map : this.chinesePinyinComparisonMapList) { |
|||
if (asc >= map.getSAscll() && asc <= map.getEAscll()) { |
|||
return map.getCode(); |
|||
} |
|||
} |
|||
} |
|||
|
|||
// 单字节或其他直接输入,不执行编码
|
|||
return c; |
|||
} |
|||
|
|||
/** |
|||
* 获取汉字拼音 |
|||
*/ |
|||
public String getHanZiPY(String str) { |
|||
try { |
|||
StringBuilder pyStrBd = new StringBuilder(); |
|||
|
|||
for (char c : str.toCharArray()) { |
|||
pyStrBd.append(getPY(c)); |
|||
} |
|||
|
|||
return pyStrBd.toString(); |
|||
} catch (Exception e) { |
|||
e.printStackTrace(); |
|||
} |
|||
|
|||
return null; |
|||
} |
|||
|
|||
|
|||
/** |
|||
* 汉字拼音字母对照类 |
|||
*/ |
|||
@Data |
|||
@AllArgsConstructor |
|||
private class ChinesePinyinComparisonMap { |
|||
// 区间开头
|
|||
private int sAscll; |
|||
|
|||
// 区间结尾
|
|||
private int eAscll; |
|||
|
|||
// 对应字母
|
|||
private char code; |
|||
} |
|||
|
|||
private static final Map<String, Object> DYZMAP = setDYZMap(); |
|||
|
|||
private static Map<String, Object> setDYZMap() { |
|||
Map<String, Object> map = new HashMap<>(); |
|||
map.put("仇", "QIU"); |
|||
map.put("柏", "BO"); |
|||
map.put("牟", "MU"); |
|||
map.put("颉", "XIE"); |
|||
map.put("解", "XIE"); |
|||
map.put("尉", "YU"); |
|||
map.put("奇", "JI"); |
|||
map.put("单", "SHAN"); |
|||
map.put("谌", "SHEN"); |
|||
map.put("乐", "YUE"); |
|||
map.put("召", "SHAO"); |
|||
map.put("朴", "PIAO"); |
|||
map.put("区", "OU"); |
|||
map.put("查", "ZHA"); |
|||
map.put("曾", "ZENG"); |
|||
map.put("缪", "MIAO"); |
|||
map.put("晟", "CHENG"); |
|||
map.put("员", "YUN"); |
|||
map.put("贠", "YUN"); |
|||
map.put("黑", "HE"); |
|||
map.put("重", "CHONG"); |
|||
map.put("秘", "BI"); |
|||
map.put("冼", "XIAN"); |
|||
map.put("折", "SHE"); |
|||
map.put("翟", "ZHAI"); |
|||
map.put("盖", "GE"); |
|||
map.put("万俟", "MOQI"); |
|||
map.put("尉迟", "YUCHI"); |
|||
return map; |
|||
} |
|||
|
|||
public String getPinYinFirst(String str) { |
|||
HanZiConverterPinYin hanZiConverterPinYin = new HanZiConverterPinYin(); |
|||
char firstChar = str.toCharArray()[0]; |
|||
String firstString = ""; |
|||
if (Character.toString(firstChar).matches("^[\u4e00-\u9fa5]+$")) { // 为中文
|
|||
char[] charPinYinChar = PinYinUtils.getCharPinYinChar(firstChar); |
|||
String result = ""; |
|||
if (DYZMAP.containsKey(Character.toString(firstChar))) { |
|||
result = DYZMAP.get(Character.toString(firstChar)).toString().substring(0, 1); |
|||
} else { |
|||
result = StringUtils.join(charPinYinChar[0]); |
|||
} |
|||
firstString = result.toUpperCase(); |
|||
} else if (Character.toString(firstChar).matches("^[a-zA-Z]")) { // 为英文字母
|
|||
firstString = Character.toString(firstChar).toUpperCase(); |
|||
} |
|||
|
|||
String code = hanZiConverterPinYin.getHanZiPY(str); |
|||
StringBuffer buffer = new StringBuffer(code); |
|||
code = buffer.replace(0, 1, firstString).toString(); |
|||
System.out.println(code); |
|||
return code; |
|||
} |
|||
|
|||
//测试
|
|||
public static void main(String[] args) { |
|||
HanZiConverterPinYin hanZiConverterPinYin = new HanZiConverterPinYin(); |
|||
String str = "仇闪"; |
|||
char firstChar = str.toCharArray()[0]; |
|||
String firstString = ""; |
|||
if (Character.toString(firstChar).matches("^[\u4e00-\u9fa5]+$")) { // 为中文
|
|||
char[] charPinYinChar = PinYinUtils.getCharPinYinChar(firstChar); |
|||
String result = ""; |
|||
if (DYZMAP.containsKey(Character.toString(firstChar))) { |
|||
result = DYZMAP.get(Character.toString(firstChar)).toString().substring(0, 1); |
|||
} else { |
|||
result = StringUtils.join(charPinYinChar[0]); |
|||
} |
|||
firstString = result.toUpperCase(); |
|||
} else if (Character.toString(firstChar).matches("^[a-zA-Z]")) { // 为英文字母
|
|||
firstString = Character.toString(firstChar).toUpperCase(); |
|||
} |
|||
|
|||
String code = hanZiConverterPinYin.getHanZiPY(str); |
|||
StringBuffer buffer = new StringBuffer(code); |
|||
code = buffer.replace(0, 1, firstString).toString(); |
|||
System.out.println(code); |
|||
} |
|||
} |
Loading…
Reference in new issue