Skip to content

Instantly share code, notes, and snippets.

@hecomi
Last active December 18, 2015 19:09
Show Gist options
  • Save hecomi/5831332 to your computer and use it in GitHub Desktop.
Save hecomi/5831332 to your computer and use it in GitHub Desktop.
日本語をローマ字にするヤツ for @arnelceledonio
// 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
@hecomi
Copy link
Author

hecomi commented Jun 22, 2013

Regarding to unexpected japanese characters, '・' and ':' and so on, adding these characters to escape_strings array may resolve the problem.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment