Last active
December 18, 2015 19:09
-
-
Save hecomi/5831332 to your computer and use it in GitHub Desktop.
日本語をローマ字にするヤツ for @arnelceledonio
This file contains hidden or 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
// install mecab by "sudo apt-get install mecab libmecab-dev mecab-naist-jdic" | |
// (this install command is for Ubuntu) | |
// install mecab-async module by "npm install mecab-async" | |
var MeCab = require('mecab-async'); | |
var mecab = new MeCab(); | |
var escape_strings = [ | |
'"', '「', '」', '。', '、', ',', '・', '"' | |
]; | |
var katakana_to_hiragana = { | |
'ア' : 'あ', | |
'イ' : 'い', | |
'ウ' : 'う', | |
'エ' : 'え', | |
'オ' : 'お', | |
'カ' : 'か', | |
'キ' : 'き', | |
'ク' : 'く', | |
'ケ' : 'け', | |
'コ' : 'こ', | |
'サ' : 'さ', | |
'シ' : 'し', | |
'ス' : 'す', | |
'セ' : 'せ', | |
'ソ' : 'そ', | |
'タ' : 'た', | |
'チ' : 'ち', | |
'ツ' : 'つ', | |
'テ' : 'て', | |
'ト' : 'と', | |
'ナ' : 'な', | |
'ニ' : 'に', | |
'ヌ' : 'ぬ', | |
'ネ' : 'ね', | |
'ノ' : 'の', | |
'ハ' : 'は', | |
'ヒ' : 'ひ', | |
'フ' : 'ふ', | |
'ヘ' : 'へ', | |
'ホ' : 'ほ', | |
'マ' : 'ま', | |
'ミ' : 'み', | |
'ム' : 'む', | |
'メ' : 'め', | |
'モ' : 'も', | |
'ヤ' : 'や', | |
'ユ' : 'ゆ', | |
'ヨ' : 'よ', | |
'ヲ' : 'を', | |
'ラ' : 'ら', | |
'リ' : 'り', | |
'ル' : 'る', | |
'レ' : 'れ', | |
'ロ' : 'ろ', | |
'ワ' : 'わ', | |
'ン' : 'ん', | |
'ヴ' : 'う゛', | |
'ァ' : 'ぁ', | |
'ィ' : 'ぃ', | |
'ゥ' : 'ぅ', | |
'ェ' : 'ぇ', | |
'ォ' : 'ぉ', | |
'ガ' : 'が', | |
'ギ' : 'ぎ', | |
'グ' : 'ぐ', | |
'ゲ' : 'げ', | |
'ゴ' : 'ご', | |
'ザ' : 'ざ', | |
'ジ' : 'じ', | |
'ズ' : 'ず', | |
'ゼ' : 'ぜ', | |
'ゾ' : 'ぞ', | |
'ダ' : 'だ', | |
'ヂ' : 'ぢ', | |
'ヅ' : 'づ', | |
'デ' : 'で', | |
'ド' : 'ど', | |
'バ' : 'ば', | |
'ビ' : 'び', | |
'ブ' : 'ぶ', | |
'ベ' : 'べ', | |
'ボ' : 'ぼ', | |
'パ' : 'ぱ', | |
'ピ' : 'ぴ', | |
'プ' : 'ぷ', | |
'ペ' : 'ぺ', | |
'ポ' : 'ぽ', | |
'ャ' : 'ゃ', | |
'ュ' : 'ゅ', | |
'ョ' : 'ょ' | |
}; | |
var hiragana_to_romaji = { | |
'う゛ぁ' : 'ba', | |
'う゛ぃ' : 'bi', | |
'う゛ぇ' : 'be', | |
'う゛ぉ' : 'bo', | |
'う゛ゅ' : 'byu', | |
'ぅ゛' : 'bu', | |
'あぁ' : 'aa', | |
'いぃ' : 'ii', | |
'いぇ' : 'ie', | |
'いゃ' : 'ya', | |
'うぅ' : 'u-', | |
'えぇ' : 'ee', | |
'おぉ' : 'o-', | |
'かぁ' : 'ka-', | |
'きぃ' : 'ki-', | |
'くぅ' : 'ku-', | |
'くゃ' : 'kya', | |
'くゅ' : 'kyu', | |
'くょ' : 'kyo', | |
'けぇ' : 'ke-', | |
'こぉ' : 'ko-', | |
'がぁ' : 'ga-', | |
'ぎぃ' : 'gi-', | |
'ぐぅ' : 'gu-', | |
'ぐゃ' : 'gya', | |
'ぐゅ' : 'gyu', | |
'ぐょ' : 'gyo', | |
'げぇ' : 'ge-', | |
'ごぉ' : 'go-', | |
'さぁ' : 'sa-', | |
'しぃ' : 'shi-', | |
'すぅ' : 'su-', | |
'すゃ' : 'sha', | |
'すゅ' : 'shu', | |
'すょ' : 'sho', | |
'せぇ' : 'se-', | |
'そぉ' : 'so-', | |
'ざぁ' : 'za-', | |
'じぃ' : 'ji-', | |
'ずぅ' : 'zu-', | |
'ずゃ' : 'zya', | |
'ずゅ' : 'zyu', | |
'ずょ' : 'zyo', | |
'ぜぇ' : 'ze-', | |
'ぞぉ' : 'zo-', | |
'たぁ' : 'ta-', | |
'ちぃ' : 'chi-', | |
'つぁ' : 'tsa', | |
'つぃ' : 'tsi', | |
'つぅ' : 'tsu-', | |
'つゃ' : 'cha', | |
'つゅ' : 'chu', | |
'つょ' : 'cho', | |
'つぇ' : 'tse', | |
'つぉ' : 'tso', | |
'てぇ' : 'te-', | |
'とぉ' : 'to-', | |
'だぁ' : 'da-', | |
'ぢぃ' : 'ji-', | |
'づぅ' : 'du-', | |
'づゃ' : 'zya', | |
'づゅ' : 'zyu', | |
'づょ' : 'zyo', | |
'でぇ' : 'de-', | |
'どぉ' : 'do-', | |
'なぁ' : 'na-', | |
'にぃ' : 'ni-', | |
'ぬぅ' : 'nu-', | |
'ぬゃ' : 'nya', | |
'ぬゅ' : 'nyu', | |
'ぬょ' : 'nyo', | |
'ねぇ' : 'ne-', | |
'のぉ' : 'no-', | |
'はぁ' : 'ha-', | |
'ひぃ' : 'hi-', | |
'ふぅ' : 'fu-', | |
'ふゃ' : 'hya', | |
'ふゅ' : 'hyu', | |
'ふょ' : 'hyo', | |
'へぇ' : 'he-', | |
'ほぉ' : 'ho-', | |
'ばぁ' : 'ba-', | |
'びぃ' : 'bi-', | |
'ぶぅ' : 'bu-', | |
'ぶゅ' : 'byu', | |
'べぇ' : 'be-', | |
'ぼぉ' : 'bo-', | |
'ぱぁ' : 'pa-', | |
'ぴぃ' : 'pi-', | |
'ぷぅ' : 'pu-', | |
'ぷゃ' : 'pya', | |
'ぷゅ' : 'pyu', | |
'ぷょ' : 'pyo', | |
'ぺぇ' : 'pe-', | |
'ぽぉ' : 'po-', | |
'まぁ' : 'ma-', | |
'みぃ' : 'mi-', | |
'むぅ' : 'mu-', | |
'むゃ' : 'mya', | |
'むゅ' : 'myu', | |
'むょ' : 'myo', | |
'めぇ' : 'me-', | |
'もぉ' : 'mo-', | |
'やぁ' : 'ya-', | |
'ゆぅ' : 'yu-', | |
'ゆゃ' : 'ya-', | |
'ゆゅ' : 'yu-', | |
'ゆょ' : 'yo-', | |
'よぉ' : 'yo-', | |
'らぁ' : 'ra-', | |
'りぃ' : 'ri-', | |
'るぅ' : 'ru-', | |
'るゃ' : 'rya', | |
'るゅ' : 'ryu', | |
'るょ' : 'ryo', | |
'れぇ' : 're-', | |
'ろぉ' : 'ro-', | |
'わぁ' : 'wa-', | |
'をぉ' : 'o-', | |
'う゛' : 'bu', | |
'でぃ' : 'di', | |
'でゃ' : 'dya', | |
'でゅ' : 'dyu', | |
'でょ' : 'dyo', | |
'てぃ' : 'ti', | |
'てゃ' : 'tya', | |
'てゅ' : 'tyu', | |
'てょ' : 'tyo', | |
'すぃ' : 'si', | |
'ずぁ' : 'zua', | |
'ずぃ' : 'zi', | |
'ずぇ' : 'ze', | |
'ずぉ' : 'zo', | |
'きゃ' : 'kya', | |
'きゅ' : 'kyu', | |
'きょ' : 'kyo', | |
'しゃ' : 'sha', | |
'しゅ' : 'shu', | |
'しぇ' : 'she', | |
'しょ' : 'sho', | |
'ちゃ' : 'cha', | |
'ちゅ' : 'chu', | |
'ちぇ' : 'che', | |
'ちょ' : 'cho', | |
'とぅ' : 'tu', | |
'とゃ' : 'tya', | |
'とゅ' : 'tyu', | |
'とょ' : 'tyo', | |
'どぁ' : 'doa', | |
'どぅ' : 'du', | |
'どゃ' : 'dya', | |
'どゅ' : 'dyu', | |
'どょ' : 'dyo', | |
'にゃ' : 'nya', | |
'にゅ' : 'nyu', | |
'にょ' : 'nyo', | |
'ひゃ' : 'hya', | |
'ひゅ' : 'hyu', | |
'ひょ' : 'hyo', | |
'みゃ' : 'mya', | |
'みゅ' : 'myu', | |
'みょ' : 'myo', | |
'りゃ' : 'rya', | |
'りゅ' : 'ryu', | |
'りょ' : 'ryo', | |
'ぎゃ' : 'gya', | |
'ぎゅ' : 'gyu', | |
'ぎょ' : 'gyo', | |
'ぢぇ' : 'je', | |
'ぢゃ' : 'ja', | |
'ぢゅ' : 'ju', | |
'ぢょ' : 'jo', | |
'じぇ' : 'je', | |
'じゃ' : 'ja', | |
'じゅ' : 'ju', | |
'じょ' : 'jo', | |
'びゃ' : 'bya', | |
'びゅ' : 'byu', | |
'びょ' : 'byo', | |
'ぴゃ' : 'pya', | |
'ぴゅ' : 'pyu', | |
'ぴょ' : 'pyo', | |
'うぁ' : 'ua', | |
'うぃ' : 'wi', | |
'うぇ' : 'we', | |
'うぉ' : 'wo', | |
'ふぁ' : 'fa', | |
'ふぃ' : 'fi', | |
'ふぇ' : 'fe', | |
'ふぉ' : 'fo', | |
'あ' : 'a', | |
'い' : 'i', | |
'う' : 'u', | |
'え' : 'e', | |
'お' : 'o', | |
'か' : 'ka', | |
'き' : 'ki', | |
'く' : 'ku', | |
'け' : 'ke', | |
'こ' : 'ko', | |
'さ' : 'sa', | |
'し' : 'shi', | |
'す' : 'su', | |
'せ' : 'se', | |
'そ' : 'so', | |
'た' : 'ta', | |
'ち' : 'chi', | |
'つ' : 'tsu', | |
'て' : 'te', | |
'と' : 'to', | |
'な' : 'na', | |
'に' : 'ni', | |
'ぬ' : 'nu', | |
'ね' : 'ne', | |
'の' : 'no', | |
'は' : 'ha', | |
'ひ' : 'hi', | |
'ふ' : 'fu', | |
'へ' : 'he', | |
'ほ' : 'ho', | |
'ま' : 'ma', | |
'み' : 'mi', | |
'む' : 'mu', | |
'め' : 'me', | |
'も' : 'mo', | |
'ら' : 'ra', | |
'り' : 'ri', | |
'る' : 'ru', | |
'れ' : 're', | |
'ろ' : 'ro', | |
'が' : 'ga', | |
'ぎ' : 'gi', | |
'ぐ' : 'gu', | |
'げ' : 'ge', | |
'ご' : 'go', | |
'ざ' : 'za', | |
'じ' : 'ji', | |
'ず' : 'zu', | |
'ぜ' : 'ze', | |
'ぞ' : 'zo', | |
'だ' : 'da', | |
'ぢ' : 'ji', | |
'づ' : 'zu', | |
'で' : 'de', | |
'ど' : 'do', | |
'ば' : 'ba', | |
'び' : 'bi', | |
'ぶ' : 'bu', | |
'べ' : 'be', | |
'ぼ' : 'bo', | |
'ぱ' : 'pa', | |
'ぴ' : 'pi', | |
'ぷ' : 'pu', | |
'ぺ' : 'pe', | |
'ぽ' : 'po', | |
'や' : 'ya', | |
'ゆ' : 'yu', | |
'よ' : 'yo', | |
'わ' : 'wa', | |
'ゐ' : 'i', | |
'ゑ' : 'e', | |
'を' : 'o', | |
'ん' : 'n', | |
'っ' : 'q', | |
'ー' : '-', | |
'ぁ' : 'a', | |
'ぃ' : 'i', | |
'ぅ' : 'u', | |
'ぇ' : 'e', | |
'ぉ' : 'o', | |
'ゎ' : 'wa', | |
' ' : ' ', | |
'---' : '-', | |
'--' : '-', | |
'aa' : 'a-', | |
'ii' : 'i-', | |
'uu' : 'u-', | |
'ee' : 'e-', | |
'ei' : 'e-', | |
'oo' : 'o-', | |
'ou' : 'o-' | |
}; | |
var zenkaku_to_hankaku = { | |
'A' : 'A', | |
'B' : 'B', | |
'C' : 'C', | |
'D' : 'D', | |
'E' : 'E', | |
'F' : 'F', | |
'G' : 'G', | |
'H' : 'H', | |
'I' : 'I', | |
'J' : 'J', | |
'K' : 'K', | |
'L' : 'L', | |
'M' : 'M', | |
'N' : 'N', | |
'O' : 'O', | |
'P' : 'P', | |
'Q' : 'Q', | |
'R' : 'R', | |
'S' : 'S', | |
'T' : 'T', | |
'U' : 'U', | |
'V' : 'V', | |
'W' : 'W', | |
'X' : 'X', | |
'Y' : 'Y', | |
'Z' : 'Z', | |
'a' : 'a', | |
'b' : 'b', | |
'c' : 'c', | |
'd' : 'd', | |
'e' : 'e', | |
'f' : 'f', | |
'g' : 'g', | |
'h' : 'h', | |
'i' : 'i', | |
'j' : 'j', | |
'k' : 'k', | |
'l' : 'l', | |
'm' : 'm', | |
'n' : 'n', | |
'o' : 'o', | |
'p' : 'p', | |
'q' : 'q', | |
'r' : 'r', | |
's' : 's', | |
't' : 't', | |
'u' : 'u', | |
'v' : 'v', | |
'w' : 'w', | |
'x' : 'x', | |
'y' : 'y', | |
'z' : 'z', | |
'0' : '0', | |
'1' : '1', | |
'2' : '2', | |
'3' : '3', | |
'4' : '4', | |
'5' : '5', | |
'6' : '6', | |
'7' : '7', | |
'8' : '8', | |
'9' : '9' | |
}; | |
/** | |
* 文字列をカナからローマ字に変換する | |
*/ | |
String.prototype.fromKanaToRomaji = function() { | |
var result = this; | |
for (var str in escape_strings) { | |
result = result.split(str).join(''); | |
} | |
for (var katakana in katakana_to_hiragana) { | |
var hiragana = katakana_to_hiragana[katakana]; | |
result = result.split(katakana).join(hiragana); | |
} | |
for (var hiragana in hiragana_to_romaji) { | |
var romaji = hiragana_to_romaji[hiragana]; | |
result = result.split(hiragana).join(romaji); | |
} | |
for (var zenkaku in zenkaku_to_hankaku) { | |
var hankaku = zenkaku_to_hankaku[zenkaku]; | |
result = result.split(zenkaku).join(hankaku); | |
} | |
while (1) { | |
var tmp = result.split('--').join('-'); | |
if (result === tmp) break; | |
else result = tmp; | |
} | |
return result; | |
}; | |
/** | |
* 文字列を n 回繰り返す | |
* @param[in] num 繰り返し回数 | |
*/ | |
String.prototype.repeat = function( num ) { | |
for(var i = 0, buf = ""; i < num; ++i) buf += this; | |
return buf; | |
}; | |
/** | |
* 数字を漢字に変換する | |
* @param[in] num 整数(1京未満) | |
*/ | |
Number.prototype.toKanji = function() { | |
var num = this; | |
if (num === 0) return 'ゼロ'; | |
if (num >= 10000000000000000) return '無理でした'; | |
var numKanji = ['', '一', '二', '三', '四', '五', '六', '七', '八', '九'] | |
, ketaKanji = ['', '十', '百', '千'] | |
, kuraiKanji = ['', '万', '億', '兆'] | |
, resultKanji = '' | |
; | |
if (num < 0) { | |
resultKanji += 'マイナス'; | |
num *= -1; | |
} | |
// 92 | |
var keta = num.toString().length | |
, kurai = 0 | |
; | |
while (num > 0) { | |
var k = keta - num.toString().length | |
, x = num%10 | |
, c = (k%4 === 0) ? kurai : 0 | |
; | |
if (k%4 === 0) ++kurai; | |
if (x === 0) k = 0; // 0のつく桁は省く | |
if (k > 0 && x === 1) x = 0; // 一桁目以外は '一' を省く | |
resultKanji = numKanji[x] + ketaKanji[k%4] + kuraiKanji[c] + resultKanji; | |
num = Math.floor(num/10); | |
} | |
return resultKanji; | |
}; | |
/** | |
* 文字列をカタカナに変換する | |
*/ | |
String.prototype.toKana = function() { | |
var result = mecab.parseSync( this.toString() ) | |
, kana = '' | |
; | |
for (var i in result) { | |
if (!result[i][9]) { | |
if (result[i][2] === '数' && !result[i][9]) { | |
kana += parseInt(result[i][0], 10).toKanji().toKana(); | |
} else { | |
kana += result[i][0]; | |
} | |
} else { | |
kana += result[i][9]; | |
} | |
} | |
return kana; | |
}; | |
/** | |
* 文字列をローマ字に変換する | |
*/ | |
String.prototype.toRomaji = function() { | |
var kana = this.toString().toKana(); | |
return kana.fromKanaToRomaji(); | |
}; | |
// Sample | |
var japanese = 'スマートフォン用充電トレー・Bluetoothスピーカー付 型番:BSSJT‐MJ'; | |
console.log(japanese.toRomaji()); | |
// OUTPUT: suma-tofonyo-ju-dentore-・Bluetoothsupi-ka-zuke kataban:BSSJT‐MJ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Regarding to unexpected japanese characters, '・' and ':' and so on, adding these characters to
escape_strings
array may resolve the problem.