Java 汉字转拼音 完整代码实例(包含多音字解决方案)

汉字转换拼音的方法是使用到一个库:pinyin4j
下载地址:
https://download.csdn.net/download/pengfei1990/15562432

maven依赖

<dependency>
      <groupId>com.belerweb</groupId>
      <artifactId>pinyin4j</artifactId>
      <version>2.5.1</version>
</dependency>

后面就是完整的工具类和多音字解决方案

public class PinYinUtils {

  public static HanyuPinyinOutputFormat PINYIN_FORMAT;
  static {

    PINYIN_FORMAT = new HanyuPinyinOutputFormat();
    /**
     * 大小写设置
     *   LOWERCASE:小写
     *   UPPERCASE:大写
     */
    PINYIN_FORMAT.setCaseType(HanyuPinyinCaseType.LOWERCASE);
    /**
     * 输出音标设置
     *
     * WITH_TONE_MARK:直接用音标符(VCharType必须设置WITH_U_UNICODE,否则会抛出异常)
     * WITH_TONE_NUMBER:1-4数字表示音标
     * WITHOUT_TONE:没有音标
     */
    PINYIN_FORMAT.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
    /**
     * 特殊音符ü的设置
     * WITH_U_AND_COLON:用u表示(没有设置默认用u表示)
     * WITH_V:用v表示
     * WITH_U_UNICODE:用ü表示
     */
    PINYIN_FORMAT.setVCharType(HanyuPinyinVCharType.WITH_U_UNICODE);
  }

  /**
   * 取汉字的拼音首字母
   * @param chinese
   * @return
   */
  public static String toFirstPinYin(String chinese){
    StringBuilder result = new StringBuilder();
    //将字符串转成字符数组
    char[] chars = chinese.toCharArray();
    try {
      for (char c : chars) {
        //是中文则进行转换
        if(String.valueOf(c).matches("[\u4e00-\u9fa5]+")){
          String[] pinyinStr = PinyinHelper.toHanyuPinyinStringArray(c, PINYIN_FORMAT);
          result.append(pinyinStr[0].charAt(0));//取每个中文的第一个拼音字母
        }else {
          result.append(c);
        }
      }
    } catch (BadHanyuPinyinOutputFormatCombination badHanyuPinyinOutputFormatCombination) {
      badHanyuPinyinOutputFormatCombination.printStackTrace();
    }
    return result.toString();
  }

  /**
   * 汉字转拼音小写
   * @param chinese
   * @return
   */
  public static String toPinYin(String chinese){
    //创建返回对象
    StringBuilder result = new StringBuilder();//方法调用的时候新建,对象没有共享,不会有线程安全问题。
    //将字符串转成字符数组
    char[] chars = chinese.toCharArray();
    try {
      for (char c : chars) {
        //是中文则进行转换
        if(String.valueOf(c).matches("[\u4e00-\u9fa5]+")){
          String[] pinyinStr = PinyinHelper.toHanyuPinyinStringArray(c, PINYIN_FORMAT);
//          result.append(pinyinStr[0].charAt(0));//取每个中文的第一个拼音字母
          result.append(pinyinStr[0]);
        }else {
          result.append(c);
        }
      }
    } catch (BadHanyuPinyinOutputFormatCombination badHanyuPinyinOutputFormatCombination) {
      badHanyuPinyinOutputFormatCombination.printStackTrace();
    }
    return result.toString();
  }
  /**
   * 汉字转拼音每个字符串的第一个字母大写其余小写
   * @param chinese
   * @return
   */
  public static String toUpperStringsFirstCharPinYin(String chinese){
    //创建返回对象
    StringBuilder result = new StringBuilder();//方法调用的时候新建,对象没有共享,不会有线程安全问题。
    //将字符串转成字符数组
    char[] chars = chinese.toCharArray();
    try {
      for (char c : chars) {
        //是中文则进行转换
        if(String.valueOf(c).matches("[\u4e00-\u9fa5]+")){
          String[] pinyinStr = PinyinHelper.toHanyuPinyinStringArray(c, PINYIN_FORMAT);
//          result.append(pinyinStr[0].charAt(0));//取每个中文的第一个拼音字母
          String c1 = String.valueOf(pinyinStr[0]);
          result.append(c1.substring(0,1).toUpperCase()).append(c1.substring(1));
        }else {
          result.append(c);
        }
      }
    } catch (BadHanyuPinyinOutputFormatCombination badHanyuPinyinOutputFormatCombination) {
      badHanyuPinyinOutputFormatCombination.printStackTrace();
    }
    return result.toString();
  }

  public static void main(String[] args) {
    //测试StringBuilder是否有线程安全问题
    String str = "拼音工具lv";
    String pinYin = toUpperStringsFirstCharPinYin(str);
    System.out.println(pinYin);
  }
}

多音字解决方案:
这里用到了jar包中的实现,即添加扩展多音字的字典
MultiPinyinConfig.multiPinyinPath = XXXX.txt
字典格式如下:

朝阳站 (chao2,yang2,zhan4)
吴圩机场 (wu2,xu1,ji1,chang3)
长白山 (chang2,bai2,shan1)

希望对有汉字拼音转换有困惑的同学有帮助

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Android TTS(Text-To-Speech)是Android系统中的一个功能,可以将文字换成语音播放。在中文语音合成中,多音字是一个比较复杂的问题。下面是一个关于Android TTS处理多音字Java实例: ```java // 初始化TTS引擎 private void initTTS() { // 创建TTS实例 mTTS = new TextToSpeech(this, new TextToSpeech.OnInitListener() { @Override public void onInit(int status) { if (status == TextToSpeech.SUCCESS) { // 设置语言为中文 int result = mTTS.setLanguage(Locale.CHINA); if (result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED) { Toast.makeText(MainActivity.this, "不支持中文语音合成", Toast.LENGTH_SHORT).show(); } else { // TTS引擎初始化成功 Toast.makeText(MainActivity.this, "TTS引擎初始化成功", Toast.LENGTH_SHORT).show(); } } else { Toast.makeText(MainActivity.this, "TTS引擎初始化失败", Toast.LENGTH_SHORT).show(); } } }); } // 播放TTS语音 private void playTTS(String text) { if (mTTS != null) { // TTS引擎可用,启动语音合成 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { // Android 5.0及以上版本 String utteranceId = UUID.randomUUID().toString(); mTTS.speak(text, TextToSpeech.QUEUE_FLUSH, null, utteranceId); } else { // Android 5.0以下版本 HashMap<String, String> params = new HashMap<>(); params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "utteranceId"); mTTS.speak(text, TextToSpeech.QUEUE_FLUSH, params); } } } // 处理多音字 private String handlePolyphone(String text) { StringBuilder sb = new StringBuilder(); char[] chars = text.toCharArray(); for (int i = 0; i < chars.length; i++) { char c = chars[i]; if (i < chars.length - 1) { char nextC = chars[i + 1]; if (isPolyphone(c, nextC)) { // 判断是否为多音字 sb.append(c).append(" "); } else { sb.append(c); } } else { sb.append(c); } } return sb.toString(); } // 判断是否为多音字 private boolean isPolyphone(char c, char nextC) { if (c == '重' && nextC == '庆') { return true; } return false; } ``` 上面的代码中,`initTTS()`方法用于初始化TTS引擎,`playTTS(String text)`方法用于播放TTS语音,`handlePolyphone(String text)`方法用于处理多音字,`isPolyphone(char c, char nextC)`方法用于判断是否为多音字。 在处理多音字时,我们可以将多音字拆分成两个字,通过在两个字之间添加一个空格来实现。这样,在播放TTS语音时,TTS引擎就会将多音字拆分开来,分别发音。 需要注意的是,上面的代码中使用了`TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID`参数来设置TTS语音的唯一标识符,这是为了兼容Android 5.0以下的版本。在Android 5.0及以上版本中,TTS语音的唯一标识符可以直接使用UUID生成一个唯一的字符串

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值