JS中文轉(zhuǎn)換拼音的實現(xiàn)

需求

此前項目中有一個中文轉(zhuǎn)拼音的需求,于是整理了一下實現(xiàn)方法寇荧。

在轉(zhuǎn)換過程中执隧,這里我保留了數(shù)字和字母,其他特殊字符或者空格將會被去掉捅膘。如 測試 會被轉(zhuǎn)換成 CeShi滚粟。(可自行修改 convert2Pinyin() 方法實現(xiàn)其他需求)

實現(xiàn)

話不多說(Github Demo

<!-- html -->
<input id="input" value="測試" />
<input id="output" disabled />
// js
window.onload = () => {
  const input = document.getElementById('input')
  const output = document.getElementById('output')

  // 失焦進(jìn)行轉(zhuǎn)換
  input.addEventListener('blur', () => {
    const val = input.value
    output.value = convertToPinyin(val)
  })

  /**
   * 轉(zhuǎn)換成拼音(若有空格凡壤、特殊字符將被移除)
   *
   * @param {string} sourceStr 原始數(shù)據(jù)
   */
  const convertToPinyin = sourceStr => {
    // 目標(biāo)數(shù)據(jù)
    let targetStr = ''
    // 匹配中文
    const cnReg = /[\u4e00-\u9fa5]/
    // 匹配數(shù)字和英文
    const enReg = /[a-zA-Z0-9]/
    // 保留英文和數(shù)字
    const keep = true

    // 遍歷源數(shù)據(jù)
    for (let i = 0, len = sourceStr.length; i < len; i++) {
      const str = sourceStr.substr(i, 1)
      if (keep && enReg.test(str)) {
        targetStr += str
      } else if (cnReg.test(str)) {
        const searchResult = searchPinYin(str, PinYin)
        if (searchResult) {
          // targetStr += searchResult
          targetStr += capitalize(searchResult) // 首字母大寫
        }
      }
    }

    return targetStr
  }

  /**
   * 檢索拼音
   *
   * @param {string} str 源字符串
   * @param {object} data 收集的拼音 Unicode 編碼集合
   */
  const searchPinYin = (str, data) => {
    for (const key in data) {
      if (data.hasOwnProperty(key) && data[key].indexOf(str) !== -1) {
        return key
      }
    }
    return ''
  }

  /**
   * 將拼音首字母轉(zhuǎn)換為大寫
   *
   * @param {string} str 源字符串
   */
  const capitalize = str => {
    if (str) {
      const [first] = str
      const other = str.replace(/^\S/, '')
      return `${first.toUpperCase()}${other}`
    }
    return str
  }

  /**
   * 目前這個 16 進(jìn)制 Unicode 編碼是網(wǎng)上收集的亚侠,可能不能覆蓋所有的中文字符硝烂,可以自行補(bǔ)充铜幽;
   *
   * 例如:‘婋’(xiao)字:
   * 1、使用 '婋'.charCodeAt(0).toString(16) 得到 Unicode 編碼:5a4b除抛;
   * 2、將編碼前面加上:\u => \u5a4b;
   * 3橄教、然后放到對象 PinYin['xiao'] 里面护蝶。
   *
   * 現(xiàn)在只想到了這種笨方法一個一個往里補(bǔ)充,如果有更好的方法持灰,歡迎指出C辈觥!姨涡!
   */
  const PinYin = {
    a: '\u554a\u963f\u9515'
    // ...
    // 由于這塊代碼太多,這里省略就不貼上來了赏表,麻煩請看 GitHub Demo匈仗。
  }
}

難點

其實在中文轉(zhuǎn)拼音的過程中,比較麻煩的在于多音字生僻字的實現(xiàn)间狂,我想到的解決思路是:

  1. 生僻字:是由于 PinYin 里面列舉的缺失一些中文字符火架,可通過 str.charCodeAt(0).toString(16) 的方式補(bǔ)充,具體方法不再贅述纺弊,上面有說明骡男。

  2. 多音字:其實多音字一直是最麻煩的地方,因為每一個中文字符只有一個對應(yīng)的 Unicode 編碼犹菱,所以需要在對象的多個對應(yīng)屬性上添加編碼骚亿。
    字,通過 '曾'.charCodeAt(0).toString(16) 獲取到 66fe来屠,然后前面拼接上 \u,得到 \u66fe捆姜。

// 截取 PinYin 一小部分
const PinYin = {
  ceng: '\u66fe',
  zeng: '\u66fe'
}

然后修改上述 convert2Pinyin()searchPinYin() 方法迎膜,把符合規(guī)則的字符返回一個數(shù)組,然后用排列組合的方式列出所有可能珊豹。

GitHub

倉庫除了拼音轉(zhuǎn)中文之外,還有其他實用方法蜕便,麻煩移步查看贩幻。如有更好的實現(xiàn)方法,歡迎留言族壳,謝謝仿荆!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末喧务,一起剝皮案震驚了整個濱河市枉圃,隨后出現(xiàn)的幾起案子孽亲,更是在濱河造成了極大的恐慌,老刑警劉巖返劲,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件篮绿,死亡現(xiàn)場離奇詭異亲配,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)犬钢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門玷犹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來洒疚,“玉大人坯屿,你說我怎么就攤上這事愿伴〉缦妫” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵怎诫,是天一觀的道長贷痪。 經(jīng)常有香客問我,道長肉津,這世上最難降的妖魔是什么舱沧? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮距糖,結(jié)果婚禮上牵寺,老公的妹妹穿的比我還像新娘帽氓。我一直安慰自己,他們只是感情好浓领,可當(dāng)我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布镊逝。 她就那樣靜靜地躺著撑蒜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪狸眼。 梳的紋絲不亂的頭發(fā)上浴滴,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天拓萌,我揣著相機(jī)與錄音,去河邊找鬼升略。 笑死微王,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的品嚣。 我是一名探鬼主播炕倘,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼翰撑!你這毒婦竟也來了罩旋?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤眶诈,失蹤者是張志新(化名)和其女友劉穎涨醋,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體逝撬,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了拦键。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片萄金。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖孙乖,靈堂內(nèi)的尸體忽然破棺而出弯屈,到底是詐尸還是另有隱情资厉,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站都哭,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏穆趴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望化戳。 院中可真熱鬧,春花似錦掠廓、人聲如沸蟀瞧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽小压。三九已至怠益,卻和暖如春蜻牢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背抱虐。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工谣沸, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留鳄抒,地道東北人瓤鼻。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像滚停,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子起惕,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容