Skip to content

Instantly share code, notes, and snippets.

@TomckySan
Last active August 29, 2015 14:02
Show Gist options
  • Save TomckySan/f1e577d1d91d389039ac to your computer and use it in GitHub Desktop.
Save TomckySan/f1e577d1d91d389039ac to your computer and use it in GitHub Desktop.
半全角カナ変換モジュール
/**
* 半全角カナ変換モジュール
* @return {[type]} [description]
*/
var kanaConverter = (function() {
// マップ作成用関数
var createKanaMap = function(properties, values) {
var kanaMap = {};
// 念のため文字数が同じかどうかをチェックする(ちゃんとマッピングできるか)
if(properties.length === values.length) {
for(var i=0, len=properties.length; i<len; i++) {
var property= properties.charCodeAt(i),
value = values.charCodeAt(i);
kanaMap[property] = value;
}
}
return kanaMap;
};
// 全角から半角への変換用マップ
var m = createKanaMap(
'アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンァィゥェォッャュョ',
'アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンァィゥェォッャュョ'
);
// 半角から全角への変換用マップ
var mm = createKanaMap(
'アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンァィゥェォッャュョ',
'アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンァィゥェォッャュョ'
);
// 全角から半角への変換用マップ
var g = createKanaMap(
'ガギグゲゴザジズゼゾダヂヅデドバビブベボ',
'カキクケコサシスセソタチツテトハヒフヘホ'
);
// 半角から全角への変換用マップ
var gg = createKanaMap(
'カキクケコサシスセソタチツテトハヒフヘホ',
'ガギグゲゴザジズゼゾダヂヅデドバビブベボ'
);
// 全角から半角への変換用マップ
var p = createKanaMap(
'パピプペポ',
'ハヒフヘホ'
);
// 半角から全角への変換用マップ
var pp = createKanaMap(
'ハヒフヘホ',
'パピプペポ'
);
var gMark = '゙'.charCodeAt(0),
pMark = '゚'.charCodeAt(0);
return {
/**
* 全角から半角への変換用関数
* @param {[type]} str 変換対象文字列
* @return {[type]} 変換後文字列
*/
convertKanaToOneByte : function(str) {
for(var i=0, len=str.length; i<len; i++) {
// 濁音もしくは半濁音文字
if(g.hasOwnProperty(str.charCodeAt(i)) || p.hasOwnProperty(str.charCodeAt(i))) {
// 濁音
if(g[str.charCodeAt(i)]) {
str = str.replace(str[i], String.fromCharCode(g[str.charCodeAt(i)])+String.fromCharCode(gMark));
}
// 半濁音
else if(p[str.charCodeAt(i)]) {
str = str.replace(str[i], String.fromCharCode(p[str.charCodeAt(i)])+String.fromCharCode(pMark));
}
else {
break;
}
// 文字列数が増加するため調整
i++;
len = str.length;
}
else {
if(m[str.charCodeAt(i)]) {
str = str.replace(str[i], String.fromCharCode(m[str.charCodeAt(i)]));
}
}
}
return str;
},
/**
* 半角から全角への変換用関数
* @param {[type]} str 変換対象文字列
* @return {[type]} 変換後文字列
*/
convertKanaToTwoByte : function(str) {
for(var i=0, len=str.length; i<len; i++) {
// console.log(str[i]);
// 濁音もしくは半濁音文字
if(str.charCodeAt(i) === gMark || str.charCodeAt(i) === pMark) {
// 濁音
if(str.charCodeAt(i) === gMark && gg[str.charCodeAt(i-1)]) {
str = str.replace(str[i-1], String.fromCharCode(gg[str.charCodeAt(i-1)]))
.replace(str[i], '');
}
// 半濁音
else if(str.charCodeAt(i) === pMark && pp[str.charCodeAt(i-1)]) {
str = str.replace(str[i-1], String.fromCharCode(pp[str.charCodeAt(i-1)]))
.replace(str[i], '');
}
else {
break;
}
// 文字列数が減少するため調整
i--;
len = str.length;
}
else {
// 1つ先の文字を見て濁音もしくは半濁音でないことを確認
if(mm[str.charCodeAt(i)] && str.charCodeAt(i+1) !== gMark && str.charCodeAt(i+1) !== pMark) {
str = str.replace(str[i], String.fromCharCode(mm[str.charCodeAt(i)]));
}
}
}
return str;
}
};
})();
console.log(kanaConverter.convertKanaToOneByte('アイウエオカキクケコkakikukekoサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲン亜位鵜ァィゥェォッャュョガギグゲゴザジズゼゾダヂヅデドバビブベボばびぶべぼパピプペポ'));
console.log(kanaConverter.convertKanaToTwoByte('アイウエオあいうえおァィゥェォカキクケコガギグゲゴサシスセソザジズゼゾタチツテトダヂヅデドッナニヌネノnaninunenoハヒフヘホバビブベボパピプペポマミムメモヤユヨャュョラリルレロワヲン'));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment