ひらがな<->ローマ字変換をするには?

解決


izumi  2009-02-14 05:16:25  No: 69670

Microsoft Visual StdioのWindowsフォームアプリケーションにてtextBox1に「あいうえお」と入力し、button1を押した場合textbox2に「aiueo」と出るようにする場合どうしたら良いでしょうか?
また例外として特定のキーワード、例えば「○○○りんご○○○」と入力した場合は「○○○おいしい!○○○」のようにローマ字に変換せずに特定の文字に変換するにはどうしたらいいでしょうか?
分かりづらい文ですがよろしくお願いします。


επιστημη  URL  2009-02-14 08:09:59  No: 69671

'あ'→'a', 'い'→'i' ... ってな対応表(辞書)を用意するだけ。
キーワード変換も同様。文字列の変換表を用意し、入力文字列中に変換表にある文字列をその部分として含むかを調べて置き換えるだけ。


επιστημη  URL  2009-02-14 08:22:29  No: 69672

あ、もちろん音便変化は規則に合わせにゃなりません。
# ちいさな'っ'は直後の子音を重ねるとか。


izumi  2009-02-14 14:08:35  No: 69673

>>επιστημηさん
返信ありがとうございます。
なるほど、対応表ですか!
恥ずかしながらその処理の仕方が分からないので参考になる記事がありましたら教えていただけませんか?


izumi  2009-02-14 20:52:02  No: 69674

そういえば肝心の使用言語が抜けていました、すいません。
c++ Windowsフォームアプリケーションです。


επιστημη  URL  2009-02-14 23:13:22  No: 69675

> 処理の仕方が分からないので

System.Collections.Generic.Dictionary<Key,Value> でも使ってくださいな。
# 辞書に相当するものならなんでもかまいません


izumi  2009-02-15 04:36:23  No: 69676

>>επιστημηさん
System.Collections.Generic.Dictionary<Key,Value>ですか・・・?
ごめんなさい、よくわからないです;;
自分なりに考えてみてローマ字からひらがなへの変換はできるようになりました
ですがひらがなからローマ字へは変換することができません
たとえば下のプログラムでtextBoxの中身のひらがなを一文字ずつ拾ってきて判定する場合は
if文の条件はどうしたらいいでしょうか?
String^inbox = textBox1->Text;
String^outbox;
int length = textBox1->Text->Length;
for(i=0;length>i;i++){ 
 if(inboxの[i]番目が「あ」なら)
  outboxに「a」を追加
 if(inboxの[i]番目が「い」なら)
  outboxに「i」を追加
 if(inboxの[i]番目が「う」なら)
  outboxに「u」を追加
    ・
    ・
    ・
}
textBox2->Text = outbox;


izumi  2009-02-15 05:28:24  No: 69677

ifを乱用した方法ですが相互変換できるようになりました
なので一応解決にチェックをしておきます
ありがとうございまいた


izumi  2009-02-15 05:47:01  No: 69678

解決になっていませんでした;;


επιστημη  URL  2009-02-15 06:49:45  No: 69679

> ifを乱用した方法ですが
プログラマのするこっちゃねぇ

using namespace System;
using namespace System::Text;
using namespace System::Collections::Generic;

int main() {
  String^ kana  = L"あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん"
                  L"がぎぐげござじずぜぞだぢづでどばびぶべぼ";
  String^ romans = L"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,"
                   L"ha,hi,fu,he,ho,ma,mi,mu,me,mo,ya,yu,yo,ra,ri,ru,re,ro,wa,wo,n,"
                   L"ga,gi,gu,ge,go,za,ji,zu,ze,zo,da,zi,zu,de,do,ba,bi,bu,be,bo";
  array<String^>^ roman = romans->Split(L',');
  Dictionary<Char,String^> dic = gcnew Dictionary<Char,String^>();
  int i = 0;
  for each ( Char ch in kana ) dic.Add(ch,roman[i++]);
  
  String^ input = L"このぶんをろおまじにする";
  StringBuilder^ builder = gcnew StringBuilder();
  for each ( Char ch in input ) builder->Append(dic[ch]);
  String^ result = builder->ToString();
  Console::WriteLine(L"in :{0}\nout:{1}", input, result);
}


izumi  2009-02-15 11:09:44  No: 69680

>>επιστημηさん
>プログラマのするこっちゃねぇ
返す言葉もございません;;
c++を始めて一週間ほどですがプログラミングの奥深さを日々感じております、
書いていただいたプログラムも調べながら少しづつ理解していきたいと思います、
ありがとうございました


επιστημη  URL  2009-02-17 23:45:10  No: 69681

ところでこのコード、C++じゃありません。C++/CLIです。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加