輸入:北京歡迎你
輸出:bei jing huan ying ni
Maven 專案加入 pinyin4j 依賴:
com.belerweb
pinyin4j
2.5.0
或手動下載 pinyin4j-2.5.0.jar 加入 classpath。
import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
public class PinyinUtil {
/**
* 漢字轉拼音(小寫、無聲調、ü 用 v 表示)
* @param src 來源字串
* @return 拼音字串,以空格分隔
*/
public static String getPinYin(String src) {
if (src == null || src.isEmpty()) return "";
char[] chars = src.toCharArray();
String[] pinyinArr = new String[chars.length];
// 設定輸出格式
HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();
format.setCaseType(HanyuPinyinCaseType.LOWERCASE); // 小寫
format.setToneType(HanyuPinyinToneType.WITHOUT_TONE); // 無聲調
format.setVCharType(HanyuPinyinVCharType.WITH_V); // ü → v
StringBuilder result = new StringBuilder();
try {
for (int i = 0; i < chars.length; i++) {
char ch = chars[i];
String chStr = Character.toString(ch);
// 判斷是否為漢字(CJK 統一表意文字基本區)
if (chStr.matches("[\\u4E00-\\u9FA5]+")) {
// 取得所有讀音(多音字),取第一個
pinyinArr = PinyinHelper.toHanyuPinyinStringArray(ch, format);
if (pinyinArr != null && pinyinArr.length > 0) {
result.append(pinyinArr[0]).append(" ");
}
} else {
// 非漢字原樣保留(不加空格)
result.append(ch);
}
}
} catch (BadHanyuPinyinOutputFormatCombination e) {
e.printStackTrace();
}
return result.toString().trim(); // 去除尾部空格
}
}
| 設定項 | 選項 | 效果 |
|---|---|---|
| CaseType | LOWERCASE / UPPERCASE | 小寫 / 大寫 |
| ToneType | WITHOUT_TONE / WITH_TONE_NUMBER / WITH_TONE_MARK | 無聲調 / 數字聲調 / 符號聲調 |
| VCharType | WITH_V / WITH_U_AND_COLON / WITH_U_UNICODE | ü→v / ü→u: / ü→ü |
PinyinHelper.toHanyuPinyinStringArray() 回傳該字所有可能讀音的陣列。範例程式直接取 [0](最常用讀音)。生產環境若需精確,可結合詞典或上下文消歧。
getFirstLetters("北京") → "bj"
public static String getFirstLetters(String src) {
String pinyin = getPinYin(src);
StringBuilder sb = new StringBuilder();
for (String part : pinyin.split(" ")) {
if (!part.isEmpty()) sb.append(part.charAt(0));
}
return sb.toString();
}