64 lines
1.4 KiB
Java
64 lines
1.4 KiB
Java
package com.imyeyu.api.util;
|
|
|
|
import me.majiajie.tinypinyin.Pinyin;
|
|
|
|
import java.util.Locale;
|
|
|
|
/// 拼音搜索工具
|
|
///
|
|
/// @author Codex
|
|
/// @since 2026-08-21
|
|
public final class PinyinUtil {
|
|
|
|
private PinyinUtil() {
|
|
}
|
|
|
|
/// 转换为无声调全拼
|
|
///
|
|
/// @param value 原始文字
|
|
/// @return 无声调全拼
|
|
public static String full(String value) {
|
|
return convert(value, false, false);
|
|
}
|
|
|
|
/// 转换为拼音首字母
|
|
///
|
|
/// @param value 原始文字
|
|
/// @return 拼音首字母
|
|
public static String initial(String value) {
|
|
return convert(value, true, false);
|
|
}
|
|
|
|
/// 转换为首字全拼、后续字首字母的混合拼音
|
|
///
|
|
/// @param value 原始文字
|
|
/// @return 混合拼音
|
|
public static String mixed(String value) {
|
|
return convert(value, false, true);
|
|
}
|
|
|
|
private static String convert(String value, boolean initial, boolean mixed) {
|
|
if (value == null) {
|
|
return null;
|
|
}
|
|
StringBuilder result = new StringBuilder(value.length());
|
|
boolean first = true;
|
|
for (char character : value.toCharArray()) {
|
|
if (Character.isWhitespace(character)) {
|
|
continue;
|
|
}
|
|
String pinyin = Pinyin.toPinyin(character).toLowerCase(Locale.ROOT);
|
|
if (pinyin.isEmpty()) {
|
|
continue;
|
|
}
|
|
if (initial || (mixed && !first)) {
|
|
result.append(pinyin.charAt(0));
|
|
} else {
|
|
result.append(pinyin);
|
|
}
|
|
first = false;
|
|
}
|
|
return result.toString();
|
|
}
|
|
}
|