pinyin4j 是成熟、輕量、無依賴的 Java 漢字轉拼音庫,廣泛應用於搜尋提示、姓名排序、輸入法引擎等場景。Maven 坐標:
<dependency>
<groupId>com.belerweb</groupId>
<artifactId>pinyin4j</artifactId>
<version>2.5.0</version>
</dependency>
// 預設輸出:帶數字聲調的小寫拼音陣列 ["zhong4", "chong2"]
String[] pinyins = PinyinHelper.toHanyuPinyinStringArray('重');
HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();
// 大小寫:UPPERCASE / LOWERCASE
format.setCaseType(HanyuPinyinCaseType.LOWERCASE);
// 聲調表示:WITH_TONE_NUMBER(數字) / WITH_TONE_MARK(符號) / WITHOUT_TONE(無)
format.setToneType(HanyuPinyinToneType.WITH_TONE_MARK);
// ü 處理:WITH_V(v) / WITH_U_AND_COLON(u:) / WITH_U_UNICODE(ü)
format.setVCharType(HanyuPinyinVCharType.WITH_U_UNICODE);
// 套用格式:["zhòng", "chóng"]
String[] formatted = PinyinHelper.toHanyuPinyinStringArray('重', format);
關鍵點:pinyin4j 僅處理單一字元。對於「重慶」、「長短」等多音字詞組,無法根據上下文自動選擇正確讀音。
public List<String> getAllPinyinCombinations(String word) {
List<String[]> charPinyins = new ArrayList<>();
for (char c : word.toCharArray()) {
String[] pys = PinyinHelper.toHanyuPinyinStringArray(c, format);
charPinyins.add(pys != null ? pys : new String[]{String.valueOf(c)});
}
// 笛卡兒積生成所有組合
return cartesianProduct(charPinyins);
}
ConcurrentHashMap<Character, String[]> 避免重複計算| 庫 | 特點 | 適用場景 |
|---|---|---|
| pinyin4j | 純 Java、輕量、單字精準 | 一般應用、Android |
| pinyin4j-modified | 修正部份 Bug、支援詞組 | 需詞組支援專案 |
| HanLP | 含分詞、NER、拼音、繁簡轉換 | NLP 密集型應用 |
| Pinyin4j-PinyinDict | 整合詞典解決多音字 | 高準確度需求 |
pinyin4j 是單字轉拼音的標準選擇,配合 HanyuPinyinOutputFormat 可滿足多種格式需求。處理詞組多音字時,務必結合分詞器與領域詞典,或接受「全組合回傳」的折中方案。選型時評估專案對準確度、效能、依賴體積的權衡。