読者です 読者をやめる 読者になる 読者になる

人生リアルタイムアタック

当面はPython学習帳

JavaScriptでひらがな/カタカナ変換あれこれ

JavaScript

CloudSearch使ってるのだけれども、トークナイズ辞書の仕様の所為かひらがなとカタカナでサジェスト時の候補返却内容が異なった。
候補のテキストフィールド自体はカタカナで、カタカナの方が意図する候補を返却していたので、JavaScriptでひらがな/カタカナに変換する方法を模索してみた。
後で加筆予定。

事前知識

Unicodeの各文字範囲

文字種別 Unicode Unicodeの示す文字範囲
全角ひらがな 0x3041 - 0x3096 ぁ, あ, ぃ, い, ... , ゕ, ゖ
全角カタカナ 0x30A1 - 0x30F6 ァ, ア, ィ, イ, ... , ヵ, ヶ
半角カタカナ 0xFF61 - 0xFF9F (順序が全角ひらがな/カタカナと異なる)

全角ひらがな → 全角カタカナは +0x60
全角カタカナ → 全角ひらがなは -0x60,

JavaScriptでの文字操作

str.charCodeAt(index)

与えられたインデックスに位置する文字のUnicodeを10進数で返却する。indexを省略した場合には、str.charCodeAt(0)と同等。

"あ".charCodeAt()
# 12354

"あ".charCodeAt(0)
# 12354

"あいう".charCodeAt()
# 12354

"あいう".charCodeAt(0)
# 12354
String.fromCharCode(num1,...,numN)

Unicode値を引数に渡すことで文字を返す。複数指定すれば文字列として返却する。

String.fromCharCode(0x3042)
# "あ"

String.fromCharCode(12354)
# "あ"

String.fromCharCode(12354, 12356)
# "あい"

文字コード範囲判定による変換方法

String.prototype.toKatakanaCase = function()
{
    var c, i = this.length, a = [];

    while(i--)
    {
        c = this.charCodeAt(i);
        a[i] = (0x3041 <= c && c <= 0x3096) ? c + 0x0060 : c;
    };

    return String.fromCharCode.apply(null, a);
};

KanaXS/toKatakanaCase.js at master · shogo4405/KanaXS · GitHub

正規表現による変換方法

function hiraganaToKatagana(src) {
    return src.replace(/[\u3041-\u3096]/g, function(match) {
        var chr = match.charCodeAt(0) + 0x60;
        return String.fromCharCode(chr);
    });
}

カタカナをひらがなに変換する JavaScript 関数、 ひらがなをカタカナに変換する JavaScript 関数 · GitHub

多分これが一番綺麗だと思います。