HarmonyOS鸿蒙Next中ArkTS汉字转拼音工具类

HarmonyOS鸿蒙Next中ArkTS汉字转拼音工具类 由于字库字数太多无法在此直接发布

请下载附件并将扩展名改为ets后拷入ArkTs工程可直接调用

export class Cn2Py {
  private pinyins: string[] =["吖", "a", "阿", "a", "啊", "a", "腌", "a", "锕", "a", "錒", "a", "嗄", "a", "厑", "a", "哎", "ai", "哀", "ai", "诶", "ai", "唉", "ai", "娭", "ai", "埃", "ai", "溾", "ai", "鎼", "ai", "鎄", "ai", "挨", "ai", "捱", "ai", "皑"]
  
  //存储汉字及拼音的map
  private pyMap: Map<string, string> = new Map()

  constructor() {
    this.pyMapLoad()
  }

  //获取字库汉字数
  ziKuHanZiCount(): number {
    return this.pinyins.length / 2
  }

  //汉字及拼音成对装入map    
  private pyMapLoad() {
    for (let i = 0; i < this.pinyins.length; i = i + 2) {
      //考虑多音字
      //多音字在pyMap中形如["长","chang,zhang"]
      const zi = this.pinyins[i]
      const yin = this.pinyins[i+1]
      const ziDy:string=this.pyMap.get(zi)//获取多音字已载入的音

      if(ziDy){//如果是多音字
        this.pyMap.set(zi,ziDy+','+yin)
      } else {//如果是单音字
        this.pyMap.set(zi,yin)
      }
    }
  }

  /**
   * 获取单字完整拼音
   * 已考虑多音字,由pyMapload处理
   * 多音字在pyMap中形如["长","chang,zhang"]
   */
  private singleZiWholePY(zi: string): string {
    let reg: RegExp = /\u4e00-\u9fa5/
    if (reg.test(zi)) {
      // 如果不是汉字则原文返回
      return zi.toLowerCase()
    }
    let wholePY: string = this.pyMap.get(zi)
    //多音字‘长’将返回形如"chang,zhang"的字符串
    return wholePY ? wholePY : ''
  }

  /**
   * 获取单字拼音的首写字母
   * 多音字“长”将返回'c,z'
   */
  private singleZiHeadPY(zi: string): string {
    let reg: RegExp = /\u4e00-\u9fa5/
    if (reg.test(zi)) {
      // 如果不是汉字则原文返回
      return zi.toLowerCase()
    }
    let wholePy: string = this.pyMap.get(zi)//可能长这样"chang,zhang"
    let wholePyArr:string[]=wholePy.split(',')
    let head=''
    for (let index = 0; index < wholePyArr.length; index++) {
      //只取每个完整音的首字母
      const element = wholePyArr[index].charAt(0).toLowerCase()
      if(index!=wholePyArr.length-1)head+=element+','
      else head+=element
    }
    //多音字‘长’将返回形如"c,z"的字符串
    return head
  }

  /**
   * 获取多个汉字的完整拼音
   * 多音字'长远'将返回'changyuan,zhangyuan'
   * 即他们的排列组合以","分开的字符串
   */
  multiZiWholePY(zis:string):string{
    const ziArr:string[]=zis.split('')
    const yinsArr:Array<Array<string>>=new Array<Array<string>>()
    for(let zi of ziArr){
      const yin=this.singleZiWholePY(zi)//对于多音字'长'此处为"chang,zhang"
      const yinArr=yin.split(',')//将"chang,zhang"字符串拆分成数组
      yinsArr.push(yinArr)
    }
    const combArr=this.getCombArr(yinsArr)
    return combArr.join(',')
  }

  /**
   * 获取多个汉字的首写拼音组合
   * 多音字'长远'将返回'cy,zy'
   * 即他们的排列组合以","分开的字符串
   */
  multiZiHeadPY(zis:string):string{
    const ziArr:string[]=zis.split('')
    const yinsArr:Array<Array<string>>=new Array<Array<string>>()
    for(let zi of ziArr){
      const yin=this.singleZiHeadPY(zi)//对于多音字'长'此处为"c,z"
      const yinArr=yin.split(',')
      yinsArr.push(yinArr)
    }
    const combArr=this.getCombArr(yinsArr)
    return combArr.join(',')
  }

  /**
   * 比较多汉字的拼音中是否包含指定字母
   * @param hanziStr 汉字字符串
   * @param pinyinStr 与汉字字符串拼音比较的拼音串,可以是完整拼音的组合
   * 也可以是首写拼音组合,但不支持全拼和简拼的混搭
   */
  contain(hanziStr:string,pinyinStr:string):boolean{
    if(hanziStr==='' || pinyinStr==='') return false
    //查找范围:完整拼音组合和首写拼音组合
    let pYs:string=this.multiZiWholePY(hanziStr)+","
      +this.multiZiHeadPY(hanziStr)
    return pYs.includes(pinyinStr)
  }

  /**
   * 二维数组的排列组合算法
   * let arrays = [[1,2,3],['a','b'],['你','我']]
   * console.log(getArrays(arrays))
   * ["1a你", "1a我", "1b你", "1b我", "2a你", "2a我", "2b你",
   * "2b我", "3a你", "3a我", "3b你", "3b我"]
   * 需要以下两个函数共同使用
   */
  private getCombArr(arrays:string[][]):string[]{
    let arr = ['']//注意此处数据有一个‘’元素
    arrays.forEach((item,idx) => {
      arr = this.combine(arr,item)
    })
    return arr
  }

  private combine(arr1:string[], arr2:string[]):string[]{
    let arr:string[]= []//必须为空
    arr1.forEach((item,index) => {
      arr2.forEach((opt,idx) => {
        arr.push(item+opt)
      })
    })
    return arr
  }
}

更多关于HarmonyOS鸿蒙Next中ArkTS汉字转拼音工具类的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于HarmonyOS鸿蒙Next中ArkTS汉字转拼音工具类的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,可以使用ArkTS编写一个汉字转拼音的工具类。以下是一个简单的实现示例:

class PinyinUtil {
    private static pinyinMap: Map<string, string> = new Map([
        ['你', 'ni'],
        ['好', 'hao'],
        // 添加更多汉字与拼音的映射
    ]);

    static toPinyin(chinese: string): string {
        let result = '';
        for (const char of chinese) {
            result += this.pinyinMap.get(char) || char;
        }
        return result;
    }
}

// 使用示例
let pinyin = PinyinUtil.toPinyin('你好');
console.log(pinyin); // 输出: nihao

这个工具类通过一个简单的映射表将汉字转换为拼音。实际应用中,可以使用更全面的拼音库来支持更多汉字。

回到顶部