質問
· 2021年3月3日

カタカナ→ローマ字変換について

カタカナ→ローマ字変換ができるサンプルクラスはありませんでしょうか?

Product version: HealthShare 2016.1
$ZV: Health Connect 2015.X
ディスカッション (2)0
続けるにはログインするか新規登録を行ってください

KURAUCHIさん、こんにちは。

私の知る限り既存のものはありませんので、簡単に自作してみました。

方針としては、UNICODEでカナ→ローマ字のコードに規則性はありませんので、面倒ですがテーブルを作成して変換するしかないと思います。

サンプルでは、促音や拗音にできる限り対処したつもりですが、抜けがあるかもしれません。

もし、このメソッドをSample.Utilsクラスに保存したとすれば、次のように実行できます。

USER>write ##class(Sample.Utils).cvtKanaToRomaji("コッチノサンプルデドウデショウ?")
kocchinosanpurudedoudeshou?
USER>
ClassMethod cvtKanaToRomaji(inStr As %String) As %String
{

    // カナテーブル
    Set kanaTbl = $lb("ア", "イ", "ウ", "エ", "オ", "カ", "キ", "ク", "ケ", "コ", "サ", "シ", "ス", "セ", "ソ")
    Set kanaTbl = kanaTbl_$lb("タ", "チ", "ツ", "テ", "ト", "ナ", "ニ", "ヌ", "ネ", "ノ", "ハ", "ヒ", "フ", "ヘ", "ホ")
    Set kanaTbl = kanaTbl_$lb("マ", "ミ", "ム", "メ", "モ", "ヤ", "ユ", "ヨ", "ラ", "リ", "ル", "レ", "ロ", "ワ", "ヲ", "ン")
    Set kanaTbl = kanaTbl_$lb("ガ", "ギ", "グ", "ゲ", "ゴ", "ザ", "ジ", "ズ", "ゼ", "ゾ", "ダ", "ヂ", "ヅ", "デ", "ド")
    Set kanaTbl = kanaTbl_$lb("バ", "ビ", "ブ", "ベ", "ボ", "パ", "ピ", "プ", "ペ", "ポ", "ー")

    // ローマ字テーブル
    Set romajiTbl = $lb("a", "i", "u", "e", "o", "ka", "ki", "ku", "ke", "ko", "sa", "shi", "su", "se", "so")
    Set romajiTbl = romajiTbl_$lb("ta", "chi", "tsu", "te", "to", "na", "ni", "nu", "ne", "no", "ha", "hi", "fu", "he", "ho")
    Set romajiTbl = romajiTbl_$lb("ma", "mi", "mu", "me", "mo", "ya", "yu", "yo", "ra", "ri", "ru", "re", "ro", "wa", "wo", "n")
    Set romajiTbl = romajiTbl_$lb("ga", "gi", "gu", "ge", "go", "za", "ji", "zu", "ze", "zo", "da", "di", "du", "de", "do")
    Set romajiTbl = romajiTbl_$lb("ba", "bi", "bu", "be", "bo", "pa", "pi", "pu", "pe", "po", "h")

    // 拗音用カナテーブル
    Set kanaTbl = kanaTbl_$lb("キャ", "キュ", "キョ", "シャ", "シュ", "ショ", "チャ", "チュ", "チョ")
    Set kanaTbl = kanaTbl_$lb("ニャ", "ニュ", "ニョ", "ヒャ", "ヒュ", "ヒョ", "ミャ", "ミュ", "ミョ", "リャ", "リュ", "リョ")
    Set kanaTbl = kanaTbl_$lb("ギャ", "ギュ", "ギョ", "ジャ", "ジュ", "ジョ", "ヂャ", "ヂュ", "ヂョ", "ビャ", "ビュ", "ビョ", "ピャ", "ピュ", "ピョ")
    
    // 拗音用ローマ字テーブル
    Set romajiTbl = romajiTbl_$lb("kya", "kyu", "kyo", "sha", "shu", "sho", "cha", "chu", "cho")
    Set romajiTbl = romajiTbl_$lb("nya", "nyu", "nyo", "hya", "hyu", "hyo", "mya", "myu", "myo", "rya", "ryu", "ryo")
    Set romajiTbl = romajiTbl_$lb("gya", "gyu", "gyo", "ja", "ju", "jo", "dya", "dyu", "dyo", "bya", "byu", "byo", "pya", "pyu", "pyo")
 
    Set outStr = ""
    Set sokuonFlag = 0
    For i = 1:1:$l(inStr) {
        Set ch = $e(inStr, i)

        // 促音
        if ch = "ッ" {
            Set sokuonFlag = 1
            Continue
        }

        // 次に拗音がくれば、くっつける
        Set nxtch = $e(inStr, i + 1)
        if (nxtch = "ャ") || (nxtch = "ュ") || (nxtch = "ョ")  {
            Set ch = ch_nxtch
            Set i = i + 1
        }

        // カナテーブルにある文字であれば、対応するローマ字を出力
        Set idx = $lf(kanaTbl, ch)
        if idx > 0 {
            Set och = $li(romajiTbl, idx)
            
            // 促音の次であれば子音を重ねる
            if (sokuonFlag = 1) && ($l(och) > 1) {
                Set och = $e(och, 1)_och
            }
 
 
        } Else {
            Set och = ch
        }
        Set outStr = outStr_och

        Set sokuonFlag = 0
    }

    Quit outStr
}

ご参考になれば幸いです。

Horita Minoru 様

お忙しいところ、貴重な情報をご提供頂きまして、誠にありがとうございます。

MWMサーバをHealthConnectで立てており、アルファベットでしか名前を登録できないモダリティとの連携が必要になり、困っておりました。

このサンプルを基に実装してみます。ありがとうございました。