# # ローマ字文字列を平仮名文字列に変換する。 # # 使用法: $kanastr = &roma2kana($romastr) # package roma2kana; @kanatbl = ( "¥241¥243", "¥241¥242", "¥241¥326", "¥241¥327", "¥243¥261", "¥243¥262", "¥243¥263", "¥243¥264", "¥243¥265", "¥243¥266", "¥243¥267", "¥243¥270", "¥243¥271", "¥243¥260", "¥244¥242", "¥244¥320", "¥244¥303 ", "¥244¥331", "¥244¥323", "¥244¥334", "¥244¥326", "¥244¥323¥244¥343", "¥244¥323¥244¥247", "¥244¥323¥244¥243", "¥244¥323¥244¥347", "¥244¥323¥244¥345", "¥244¥303 ", "¥244¥301¥244¥343", "¥244¥301¥244¥247", "¥244¥301", "¥244¥301¥244¥347", "¥244¥301¥244¥345", "¥244¥300", "¥244¥303 ", "¥244¥307", "¥244¥302", "¥244¥311", "¥244¥305", "¥244¥302¥244¥343", "¥244¥302¥244¥247", "¥244¥302¥244¥243", "¥244¥302¥244¥347", "¥244¥302¥244¥345", "¥244¥250", "¥244¥325¥244¥241", "¥244¥325¥244¥247", "¥244¥303 ", "¥244¥325¥244¥243", "¥244¥325¥244¥251", "¥244¥325", "¥244¥254", "¥244¥262", "¥244¥303 ", "¥244¥256", "¥244¥264", "¥244¥260", "¥244¥256¥244¥343", "¥244¥256¥244¥247", "¥244¥256¥244¥243", "¥244¥256¥244¥347", "¥244¥256¥244¥345", "¥244¥317", "¥244¥330", "¥244¥303 ", "¥244¥322", "¥244¥333", "¥244¥325", "¥244¥322¥244¥343", "¥244¥322¥244¥243", "¥244¥322¥244¥345", "¥244¥322¥244¥247", "¥244¥322¥244¥347", "¥244¥244", "¥244¥270¥244¥343", "¥244¥270¥244¥247", "¥244¥270", "¥244¥303 ", "¥244¥270¥244¥347", "¥244¥270¥244¥345", "¥244¥253", "¥244¥261", "¥244¥255", "¥244¥303 ", "¥244¥263", "¥244¥257", "¥244¥255¥244¥343", "¥244¥255¥244¥247", "¥244¥255¥244¥243", "¥244¥255¥244¥347", "¥244¥255¥244¥345", "¥244¥351", "¥244¥354", "¥244¥352", "¥244¥303 ", "¥244¥355", "¥244¥353", "¥244¥352¥244¥343", "¥244¥352¥244¥247", "¥244¥352¥244¥243", "¥244¥352¥244¥347", "¥244¥352¥244¥345", "¥244¥336", "¥244¥341", "¥244¥337", "¥244¥303 ", "¥244¥342", "¥244¥340", "¥244¥337¥244¥343", "¥244¥337¥244¥247", "¥244¥337¥244¥243", "¥244¥337¥244¥347", "¥244¥337¥244¥345", "¥244¥363", "¥244¥363 ", "¥244¥363", "¥244¥312", "¥244¥315", "¥244¥313", "¥244¥316", "¥244¥314", "¥244¥313¥244¥343", "¥244¥313¥244¥247", "¥244¥313¥244¥243", "¥244¥313¥244¥347", "¥244¥313¥244¥345", "¥244¥363 ", "¥244¥252", "¥244¥321", "¥244¥332", "¥244¥324", "¥244¥335", "¥244¥303 ", "¥244¥327", "¥244¥324¥244¥343", "¥244¥324¥244¥247", "¥244¥324¥244¥243", "¥244¥324¥244¥347", "¥244¥324¥244¥345", "¥244¥351", "¥244¥354", "¥244¥352", "¥244¥355", "¥244¥303 ", "¥244¥353", "¥244¥352¥244¥343", "¥244¥352¥244¥247", "¥244¥352¥244¥243", "¥244¥352¥244¥347", "¥244¥352¥244¥345", "¥244¥265", "¥244¥273", "¥244¥267¥244¥343", "¥244¥267¥244¥247", "¥244¥267", "¥244¥267¥244¥347", "¥244¥267¥244¥345", "¥244¥267", "¥244¥275", "¥244¥303 ", "¥244¥271", "¥244¥267¥244¥343", "¥244¥267¥244¥247", "¥244¥267¥244¥243", "¥244¥267¥244¥347", "¥244¥267¥244¥345", "¥244¥277", "¥244¥306", "¥244¥301", "¥244¥310", "¥244¥304", "¥244¥303 ", "¥244¥304", "¥244¥301¥244¥343", "¥244¥301¥244¥247", "¥244¥301¥244¥243", "¥244¥301¥244¥347", "¥244¥301¥244¥345", "¥244¥246", "¥244¥357", "¥244¥361", "¥244¥360", "¥244¥362", "¥244¥303 ", "¥244¥241", "¥244¥247", "¥244¥243", "¥244¥251", "¥244¥303", "¥244¥245", "¥244¥343", "¥244¥347", "¥244¥345", "¥244¥344", "¥244¥250", "¥244¥244", "¥244¥350", "¥244¥346", "¥244¥303 ", "¥244¥266", "¥244¥274", "¥244¥270", "¥244¥276", "¥244¥272", "¥244¥270¥244¥343", "¥244¥270¥244¥247", "¥244¥270¥244¥243", "¥244¥270¥244¥347", "¥244¥270¥244¥345", "¥244¥303 ", "¥241¥274", ); @ctype = ( 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 3, 4, 5, 1, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 1, 17, 1, 1, 1, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 1, 34, 35, 36, 37, 1, 38, 39, 40, 41, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ); @nstate = ( 76,240,234, 38, 40, 39, 47, 59, 56, 69, 79, 83, 86, 89, 96,113, 120,124,130, 13, 35, 14,127, 17, 12, 9,103, 15, 11, 10, 8, 1, 77, 7, 6, 3, 2, 48, 29, 5, 16, 4,104,104,105,104,104,104, 106,106,106,106,106,106,106,106,106,106,104,104,107,104,104,104, 108,104,104,104,109,104,104,104,104,104,110,104,104,104,104,111, 104,112, 24,104,136, 49, 0, 0,137, 0, 33,149,138, 0, 0,150, 0, 0,139,151,128, 37,141,142,129,152, 27, 20,131, 36,154,241, 162, 34,132, 0,163,133, 0,134,164, 0, 30, 0,121,242,165, 0, 122, 0,243,166,123,114, 22,168, 0,115,167, 0,125,116, 0,126, 0, 97, 21,117,118, 98, 0, 0,119, 99, 70, 23, 0,100, 71,101, 0, 72, 73, 0,102, 0, 90, 25, 74, 0, 91, 0, 0, 75, 92, 0, 18, 93, 63,155, 94, 0, 64, 84, 65, 95, 66, 85, 26,143, 0, 0, 67, 87, 0, 41, 43, 68, 88, 42, 31, 19, 50, 44,153, 51, 52, 0, 78, 45, 53,156,135, 80, 46,157, 54, 32,140,158, 0, 55, 0, 82, 28,159, 0, 57, 0, 0,160, 58, 61,161,189, 60,194, 0,190, 0, 195, 81,191,224,196, 0, 62,225,192, 0,197,226,219,193, 0,198, 220,227, 0,244,221,214,228,245, 0,215,222,246,209,216, 0,223, 210,247, 0,217,211,204,248, 0,218,205,212, 0,199,206,235,213, 200, 0,236,207,201,179,237, 0,208,180,202, 0,238,181,144,203, 0,239,145,182, 0,229,146,184,183,230, 0,185,147,231, 0,186, 0, 0,148,232, 0,187, 0,169,233,174,188,170, 0,175, 0,171, 0,176, 0, 0, 0,172, 0,177, 0, 0,173, 0,178 ); @pstate = ( 0, 36, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 35, 0, 0, 2, 0, 35, 5, 2, 0, 0, 5, 0, 0, 2, 5, 3, 2, 2, 2, 3, 5, 2, 3, 3, 5, 5, 34, 4, 5, 3, 0, 4, 3, 0, 3, 4, 0, 3, 0, 6, 34, 4, 0, 6, 0, 34, 4, 6, 7, 4, 4, 0, 7, 6, 0, 6, 7, 0, 6, 0, 8, 6, 7, 7, 8, 0, 0, 7, 8, 9, 7, 0, 8, 9, 8, 0, 9, 9, 0, 8, 0, 10, 8, 9, 0, 10, 0, 0, 9, 10, 0, 9, 10, 12, 11, 10, 0, 12, 11, 12, 10, 12, 11, 10, 11, 0, 0, 12, 11, 0, 13, 13, 12, 11, 13, 12, 11, 14, 13, 15, 14, 14, 0, 15, 13, 14, 16, 15, 15, 13, 16, 14, 13, 15, 16, 0, 14, 0, 15, 14, 16, 0, 17, 0, 0, 16, 17, 17, 16, 18, 17, 19, 0, 18, 0, 19, 17, 18, 20, 19, 0, 17, 20, 18, 0, 19, 20, 21, 18, 0, 19, 21, 20, 0, 22, 21, 23, 20, 22, 0, 23, 21, 22, 24, 23, 0, 21, 24, 22, 0, 23, 24, 25, 22, 0, 23, 25, 24, 0, 26, 25, 27, 24, 26, 0, 27, 25, 26, 28, 27, 0, 25, 28, 26, 0, 27, 28, 29, 26, 0, 27, 29, 28, 0, 30, 29, 31, 28, 30, 0, 31, 29, 30, 0, 31, 0, 0, 29, 30, 0, 31, 0, 32, 30, 33, 31, 32, 0, 33, 0, 32, 0, 33, 0, 0, 0, 32, 0, 33, 0, 0, 32, 0, 33 ); @nindex = ( 0, 42, 66, 82, 94, 73,106,115,127,136,148,161,160,177,184,186, 193,209,216,218,225,234,241,243,250,259,266,268,275,284,291,293, 309,311, 93, 65,-36,-35 ); @out = ( 3, 2,211, 17, 19, 18, 20, 21, 22, 15,179, 28, 34, 35, 36, 37, 38, 39, 7, 46, 47, 6, 49, 48, 51, 52, 53, 54, 55, 56, 57, 8, 63, 64, 65, 66, 67, 68, 1,128, 76, 9, 78, 50, 80, 10, 82, 83, 11, 85, 86, 12, 92, 93, 94, 95, 96, 97, 13,103,104,105,106,107, 108, 74,127,114,115,117,118,119,120,121,116, 14,129,130,131,132, 133,134, 4,140,141,142, 5,144,145, 45,151,152, 16,158,159,160, 161, 77,167,168,169,170, 79,172,173, 84,180,181,182,183,184,185, 186,187,188, 75,190, 81,194,195,196,197,198,199,200,201,202,203, 204,143,210, 23, 24, 25, 26, 27, 29, 30, 31, 32, 33, 40, 41, 42, 43, 44, 58, 59, 60, 61, 62, 69, 72, 70, 73, 71, 87, 88, 89, 90, 91, 98, 99,100,101,102,109,110,111,112,113,122,123,124,125,126, 135,136,137,138,139,146,147,148,149,150,153,154,155,156,157,162, 163,164,165,166,171,174,175,176,177,178,189,191,192,193,205,206, 207,208,209 ); sub init { $state = 0; $kanastr = ''; } sub trans { local($c) = @_; local($index); $index = $nindex[$state] + $ctype[ord($c)]; if($index < 0 || $index >= 349){ $state = 0; } else { $state = (($pstate[$index] == $state) ? $nstate[$index] : 0 ); } $seq .= $c; if($state == 0){ return 0; } if($state > 37){ $str = $kanatbl[$out[$state-38]-2]; $again = ($str =‾ s/ $//); $kanastr .= $str; $state = 0; do trans($c) if $again; $seq = ''; return 1; } return 0; } sub main'roma2kana { local($romastr) = @_; local($i); do init(); for($i=0; $i < length($romastr); $i++){ do trans(substr($romastr,$i,1)); } do trans(''); return $kanastr . $seq; } 1;