日本語文字種変換

ひらがな、カタカナ、半角カタカナの相互変換

此腳本不應該直接安裝,它是一個供其他腳本使用的函式庫。欲使用本函式庫,請在腳本 metadata 寫上: // @require https://update.greasyfork.org/scripts/460236/1151036/%E6%97%A5%E6%9C%AC%E8%AA%9E%E6%96%87%E5%AD%97%E7%A8%AE%E5%A4%89%E6%8F%9B.js

// ==UserScript==
// @namespace    http://tampermonkey.net/
// @exclude      *

// ==UserLibrary==
// @author       Eskey Easy
// @name         日本語文字種変換
// @description  ひらがな、カタカナ、半角カタカナの相互変換
// @license      MIT
// @version      0.1
// @grant        none
// ==/UserScript==
// ==/UserLibrary==

/**
 *
 * @param {string} str ひらがな
 * @returns 全角カナ
 * @see https://qiita.com/mimoe/items/855c112625d39b066c9a
 */
function hiraToKana(str) {
  return str.replace(/[\u3041-\u3096]/g, function (match) {
    var chr = match.charCodeAt(0) + 0x60;
    return String.fromCharCode(chr);
  });
}

/**
 *
 * @param {string} str 全角カナ
 * @returns ひらがな
 * @see https://qiita.com/mimoe/items/855c112625d39b066c9a
 */
function kanaToHira(str) {
  return str.replace(/[\u30a1-\u30f6]/g, function (match) {
    var chr = match.charCodeAt(0) - 0x60;
    return String.fromCharCode(chr);
  });
}

/**
 *
 * @param {string} str 全角カナ
 * @returns 半角カナ
 * @see https://www.yoheim.net/blog.php?q=20191101
 */
function zenkana2Hankana(str) {
  var kanaMap = {
    ガ: 'ガ',
    ギ: 'ギ',
    グ: 'グ',
    ゲ: 'ゲ',
    ゴ: 'ゴ',
    ザ: 'ザ',
    ジ: 'ジ',
    ズ: 'ズ',
    ゼ: 'ゼ',
    ゾ: 'ゾ',
    ダ: 'ダ',
    ヂ: 'ヂ',
    ヅ: 'ヅ',
    デ: 'デ',
    ド: 'ド',
    バ: 'バ',
    ビ: 'ビ',
    ブ: 'ブ',
    ベ: 'ベ',
    ボ: 'ボ',
    パ: 'パ',
    ピ: 'ピ',
    プ: 'プ',
    ペ: 'ペ',
    ポ: 'ポ',
    ヴ: 'ヴ',
    ヷ: 'ヷ',
    ヺ: 'ヺ',
    ア: 'ア',
    イ: 'イ',
    ウ: 'ウ',
    エ: 'エ',
    オ: 'オ',
    カ: 'カ',
    キ: 'キ',
    ク: 'ク',
    ケ: 'ケ',
    コ: 'コ',
    サ: 'サ',
    シ: 'シ',
    ス: 'ス',
    セ: 'セ',
    ソ: 'ソ',
    タ: 'タ',
    チ: 'チ',
    ツ: 'ツ',
    テ: 'テ',
    ト: 'ト',
    ナ: 'ナ',
    ニ: 'ニ',
    ヌ: 'ヌ',
    ネ: 'ネ',
    ノ: 'ノ',
    ハ: 'ハ',
    ヒ: 'ヒ',
    フ: 'フ',
    ヘ: 'ヘ',
    ホ: 'ホ',
    マ: 'マ',
    ミ: 'ミ',
    ム: 'ム',
    メ: 'メ',
    モ: 'モ',
    ヤ: 'ヤ',
    ユ: 'ユ',
    ヨ: 'ヨ',
    ラ: 'ラ',
    リ: 'リ',
    ル: 'ル',
    レ: 'レ',
    ロ: 'ロ',
    ワ: 'ワ',
    ヲ: 'ヲ',
    ン: 'ン',
    ァ: 'ァ',
    ィ: 'ィ',
    ゥ: 'ゥ',
    ェ: 'ェ',
    ォ: 'ォ',
    ッ: 'ッ',
    ャ: 'ャ',
    ュ: 'ュ',
    ョ: 'ョ',
    '。': '。',
    '、': '、',
    ー: 'ー',
    '「': '「',
    '」': '」',
    '・': '・',
  };
  var reg = new RegExp('(' + Object.keys(kanaMap).join('|') + ')', 'g');
  return str
    .replace(reg, function (match) {
      return kanaMap[match];
    })
    .replace(/゛/g, '゙')
    .replace(/゜/g, '゚');
}

/**
 *
 * @param {string} str 半角カナ
 * @returns 全角カナ
 * @see https://www.yoheim.net/blog.php?q=20191101
 */
function hankana2Zenkana(str) {
  var kanaMap = {
    ガ: 'ガ',
    ギ: 'ギ',
    グ: 'グ',
    ゲ: 'ゲ',
    ゴ: 'ゴ',
    ザ: 'ザ',
    ジ: 'ジ',
    ズ: 'ズ',
    ゼ: 'ゼ',
    ゾ: 'ゾ',
    ダ: 'ダ',
    ヂ: 'ヂ',
    ヅ: 'ヅ',
    デ: 'デ',
    ド: 'ド',
    バ: 'バ',
    ビ: 'ビ',
    ブ: 'ブ',
    ベ: 'ベ',
    ボ: 'ボ',
    パ: 'パ',
    ピ: 'ピ',
    プ: 'プ',
    ペ: 'ペ',
    ポ: 'ポ',
    ヴ: 'ヴ',
    ヷ: 'ヷ',
    ヺ: 'ヺ',
    ア: 'ア',
    イ: 'イ',
    ウ: 'ウ',
    エ: 'エ',
    オ: 'オ',
    カ: 'カ',
    キ: 'キ',
    ク: 'ク',
    ケ: 'ケ',
    コ: 'コ',
    サ: 'サ',
    シ: 'シ',
    ス: 'ス',
    セ: 'セ',
    ソ: 'ソ',
    タ: 'タ',
    チ: 'チ',
    ツ: 'ツ',
    テ: 'テ',
    ト: 'ト',
    ナ: 'ナ',
    ニ: 'ニ',
    ヌ: 'ヌ',
    ネ: 'ネ',
    ノ: 'ノ',
    ハ: 'ハ',
    ヒ: 'ヒ',
    フ: 'フ',
    ヘ: 'ヘ',
    ホ: 'ホ',
    マ: 'マ',
    ミ: 'ミ',
    ム: 'ム',
    メ: 'メ',
    モ: 'モ',
    ヤ: 'ヤ',
    ユ: 'ユ',
    ヨ: 'ヨ',
    ラ: 'ラ',
    リ: 'リ',
    ル: 'ル',
    レ: 'レ',
    ロ: 'ロ',
    ワ: 'ワ',
    ヲ: 'ヲ',
    ン: 'ン',
    ァ: 'ァ',
    ィ: 'ィ',
    ゥ: 'ゥ',
    ェ: 'ェ',
    ォ: 'ォ',
    ッ: 'ッ',
    ャ: 'ャ',
    ュ: 'ュ',
    ョ: 'ョ',
    '。': '。',
    '、': '、',
    ー: 'ー',
    '「': '「',
    '」': '」',
    '・': '・',
  };

  var reg = new RegExp('(' + Object.keys(kanaMap).join('|') + ')', 'g');
  return str
    .replace(reg, function (match) {
      return kanaMap[match];
    })
    .replace(/゙/g, '゛')
    .replace(/゚/g, '゜');
}