首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 漢字轉拼音實戰:Pinyin4j 庫完整使用指南

     編輯:Java 相關知識

使用 Pinyin4j 實現漢字轉全拼、首字母、ASCII 碼,並構建拼音索引 Map 實現反向查詢(拼音→漢字列表)。

Maven 依賴


<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();
    }
}

拼音索引 Map:反向查詢


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 返回所有讀音,業務需決定策略(首個/全部/上下文)
  • 編碼一致性:資料庫/檔案/網路傳輸統一 UTF-8
  • 效能優化:大量轉換時快取 char→String[] 結果
  • 姓名專用:考慮 NamePinyinUtil 處理罕見字、異體字
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved