使用 Pinyin4j 實現漢字轉全拼、首字母、ASCII 碼,並構建拼音索引 Map 實現反向查詢(拼音→漢字列表)。
<dependency>
<groupId>com.belerweb</groupId>
<artifactId>pinyin4j</artifactId>
<version>2.5.0</version>
</dependency>
public class PinyinUtil {
private static final HanyuPinyinOutputFormat FORMAT = new HanyuPinyinOutputFormat();
static {
FORMAT.setCaseType(HanyuPinyinCaseType.LOWERCASE);
FORMAT.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
FORMAT.setVCharType(HanyuPinyinVCharType.WITH_V);
}
/** 漢字轉全拼(取首個讀音) */
public static String toPinyin(String chinese) {
StringBuilder sb = new StringBuilder();
for (char c : chinese.toCharArray()) {
if (String.valueOf(c).matches("[\\u4E00-\\u9FA5]")) {
try {
String[] pinyins = PinyinHelper.toHanyuPinyinStringArray(c, FORMAT);
if (pinyins != null && pinyins.length > 0)
sb.append(pinyins[0]);
} catch (Exception e) { sb.append(c); }
} else {
sb.append(c); // 非漢字原樣保留
}
}
return sb.toString();
}
/** 提取首字母 */
public static String toInitials(String chinese) {
StringBuilder sb = new StringBuilder();
for (char c : chinese.toCharArray()) {
String[] pinyins = PinyinHelper.toHanyuPinyinStringArray(c, null);
if (pinyins != null && pinyins.length > 0)
sb.append(pinyins[0].charAt(0));
else
sb.append(c);
}
return sb.toString();
}
/** 轉 ASCII 十六進位 */
public static String toAsciiHex(String input) {
StringBuilder sb = new StringBuilder();
for (byte b : input.getBytes(StandardCharsets.UTF_8)) // 或 GBK
sb.append(String.format("%02X", b & 0xFF));
return sb.toString();
}
}
public class PinyinIndex {
public static void main(String[] args) {
Map<String, String> nameToPinyin = new HashMap<>();
nameToPinyin.put("張開", "ZK");
nameToPinyin.put("占狂", "ZK");
nameToPinyin.put("劉德華", "LDH");
nameToPinyin.put("張學友", "ZXY");
nameToPinyin.put("王力宏", "WLH");
nameToPinyin.put("鄧紫棋", "DZQ");
nameToPinyin.put("舒暢", "SC");
// 構建 多對一 索引:拼音 → 姓名列表
Map<String, List<String>> pinyinToNames = new HashMap<>();
for (Map.Entry<String, String> e : nameToPinyin.entrySet()) {
pinyinToNames.computeIfAbsent(e.getValue(), k -> new ArrayList<>()).add(e.getKey());
}
// 互動查詢
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.print("輸入拼音查詢 (exit 退出): ");
String input = scanner.nextLine();
if ("exit".equalsIgnoreCase(input)) break;
List<String> names = pinyinToNames.get(input.toUpperCase());
System.out.println(names != null ? names : "無匹配");
}
}
}
輸入拼音查詢 (exit 退出): ZK [張開, 占狂] 輸入拼音查詢 (exit 退出): LDH [劉德華] 輸入拼音查詢 (exit 退出): exit
toHanyuPinyinStringArray 返回所有讀音,業務需決定策略(首個/全部/上下文)char→String[] 結果NamePinyinUtil 處理罕見字、異體字