前言
我们在做项目的时候,可能会遇到将中文转化成拼音来做排序的依据,不过如果没有工具类,要把全部的中文都对应好拼音,也是一个不小的工作量,好在有现成的类库已经帮我们准备好了,我们只要花很小的时间,稍加定制就可以了,那就是pinyin4j
更方便的是,连常用的将字符转成首字母拼音,或者全拼,这些常用的,都用工具类写好了!
引入pinyin4j依赖
如果是Maven,加入pom.xml:
<!-- https://mvnrepository.com/artifact/com.belerweb/pinyin4j -->
<dependency>
<groupId>com.belerweb</groupId>
<artifactId>pinyin4j</artifactId>
<version>2.5.1</version>
</dependency>
如果是Gradle,加入build.gradle
implementation("com.belerweb:pinyin4j:2.5.1")
工具类,外加测试
如何使用都写在注释里了,请取用
import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
public class Pinyin4jUtils {
public static void main(String[] args) {
// 中文转成全拼大写测试,并用空白分割打印
String[] strings = getFullPinyin("拼音测试", true);
// 使用String.join来输出,如果你用的JDK比较落后,那么就迭代每个string,拼接出来
System.out.println(String.join(" ", strings)); // PIN YIN CE SHI
// 中文转成首字母小写测试
String[] strings2 = getInitialPinyin("拼音测试", false);
System.out.println(String.join("", strings2)); // pycs
}
/**
* 将字符串转成首字母拼音
* @param source 字符
* @param uppercase 是否大写
*/
public static String[] getInitialPinyin(String source, boolean uppercase) {
char[] chars = source.toCharArray();
String[] strings = new String[chars.length];
for (int i = 0; i < chars.length; i++) {
strings[i] = getInitialPinyin(chars[i], uppercase);
}
return strings;
}
/**
* 将char转成首字母拼音
* @param source 字符
* @param uppercase 是否大写
*/
public static String getInitialPinyin(char source, boolean uppercase) {
String result = getFullPinyin(source, uppercase);
if (result == null || result.length() == 0) {
return "";
}
return result.substring(0, 1);
}
/**
* 将字符串转成全部拼音
* @param source 字符
* @param uppercase 是否大写
*/
public static String[] getFullPinyin(String source, boolean uppercase) {
char[] chars = source.toCharArray();
String[] strings = new String[chars.length];
for (int i = 0; i < chars.length; i++) {
strings[i] = getFullPinyin(chars[i], uppercase);
}
return strings;
}
/**
* 将char转成全部拼音
* @param source 字符
* @param uppercase 是否大写
*/
public static String getFullPinyin(char source, boolean uppercase) {
if (source <= 128) {
return String.valueOf(source);
}
if (String.valueOf(source).matches("[\\u4E00-\\u9FA5]+")) {//中文
HanyuPinyinOutputFormat hanYuPinOutputFormat = new HanyuPinyinOutputFormat();
// 输出设置,大小写,音标方式等
hanYuPinOutputFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
hanYuPinOutputFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
hanYuPinOutputFormat.setVCharType(HanyuPinyinVCharType.WITH_V);
String[] strings = null;
try {
strings = PinyinHelper.toHanyuPinyinStringArray(source, hanYuPinOutputFormat);
} catch (BadHanyuPinyinOutputFormatCombination badHanyuPinyinOutputFormatCombination) {
return "";
}
if (strings == null || strings.length == 0) {
return "";
}
return uppercase ? strings[0].toUpperCase() : strings[0];
} else if (((int) source >= 65 && (int) source <= 90)
|| ((int) source >= 97 && (int) source <= 122)) {//英文
return String.valueOf(source);
} else {
return "";
}
}
}
文章评论