Javascriptでの半角カナ→全角カタカナ変換と、カタカナ→ひらがな変換

Javascriptで表題の変換をするときに、検索してみたもののぱっと見適切なものはなく、作っちゃえ、ということで作りました。

作ったコードは以下です。

String.prototype.toHiragana = function() {
	str = this.toFullWidthKana();
	return str.replace(/[ァ-ヶ]/g, function(match) {
		return String.fromCharCode(match.charCodeAt(0) - 0x60);
	});
}

String.prototype.toFullWidthKana = function() {
	str = this.replace(/[ウカ-トハ-ホワヲ]゙|[ハ-ホ]゚/g, function(match) {
		return String.prototype.toFullWidthKana.mapDakuon[match];
	});
	return str.replace(/[。-゚]/g, function(match) {
		return String.prototype.toFullWidthKana.mapFull[match.charCodeAt(0) - 0xFF61];
	});
}
String.prototype.toFullWidthKana.mapDakuon = {
	'ガ':'ガ','ギ':'ギ','グ':'グ','ゲ':'ゲ','ゴ':'ゴ',
	'ザ':'ザ','ジ':'ジ','ズ':'ズ','ゼ':'ゼ','ゾ':'ゾ',
	'ダ':'ダ','ヂ':'ヂ','ヅ':'ヅ','デ':'デ','ド':'ド',
	'バ':'バ','ビ':'ビ','ブ':'ブ','ベ':'ベ','ボ':'ボ',
	'パ':'パ','ピ':'ピ','プ':'プ','ペ':'ペ','ポ':'ポ',
	'ヷ':'ヷ','ヴ':'ヴ','ヺ':'ヺ'
};
String.prototype.toFullWidthKana.mapFull = [
		 '。','「','」','、','・','ヲ','ァ','ィ','ゥ','ェ','ォ','ャ','ュ','ョ','ッ',
	'ー','ア','イ','ウ','エ','オ','カ','キ','ク','ケ','コ','サ','シ','ス','セ','ソ',
	'タ','チ','ツ','テ','ト','ナ','ニ','ヌ','ネ','ノ','ハ','ヒ','フ','ヘ','ホ','マ',
	'ミ','ム','メ','モ','ヤ','ユ','ヨ','ラ','リ','ル','レ','ロ','ワ','ン','゛','゜'
];

Stringの拡張で作ってありますが、関数に書き直すことは容易と思います。

 

1行からがカタカナからひらがなへの変換。

大抵この手の変換は、3-5行のように、範囲をひっかけてオフセットを足したり引いたりしてあげますよね(言語を問わず)。
同様の論理で、逆の平仮名から片仮名への変換も可能です。

半角カタカナが含まれているかもしれませんので、2行で全角変換を呼んでいます。

 

8行からが、その半角カナを全角に変換するメソッドです。

半角カナと全角カタカナのコードは正対していませんから、マップを作る必要があります。

そのマップが、16行のString.prototype.toFullWidthKana.mapDakuonと、24行のString.prototype.toFullWidthKana.mapFullです。
その関数の中でしか使わない定数(或はstaticな変数)は、その関数(オブジェクト)のプロパティにして外のスコープを汚染しないようにする、というのは、よく使う手です。(新しいjavascriptにはconstがあって関数内に定義できるかもしれません。その場合は旧版との互換ということで。)

9-11行が濁点半濁点付きの全角文字がある場合の変換、12-15行がその他の半角カナを全角に変換しています。

12行の正規表現はわかりにくいかもしれませんが、UNICODEの半角カナの範囲をご参照ください。([\uff61-\uff9f]のように書いてもよいかも。)

 

以下のような使い方で行けるかと思います。(試していませんので、バグはあるかも。)

// ひらがなの取得。'ぷぎゃーぷぎゃー'の戻りが期待。
var hiragana = 'プギャープギャー'.toHiragana();
// 全角カタカナの取得。'プギャー'の戻りが期待。
var fullWidthKana = 'プギャー'.toFullWidthKana();

 

余談です。

作っていてわかったのですが、UNICODEの片仮名にはわ行の濁音「ヷヸヹヺ」があるのですが、平仮名にはないのですね。

なんでだろう?
そしてどう発音するのだろう?

(「ゔ」の発音がvuなら、「ヷヸヹヺ」はva,vi,ve,voなのでしょうね。
ヴァイオリン→ヷイオリン、ヴィブラート→ヸブラート、ヴェネチア→ヹネチア、ヴォーカル→ヺーカル)

コメントを残す