Last active
August 29, 2015 14:02
-
-
Save TomckySan/f1e577d1d91d389039ac to your computer and use it in GitHub Desktop.
半全角カナ変換モジュール
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* 半全角カナ変換モジュール | |
* @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