スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

C++でひらがなをローマ字に変換

OpenCVでは日本語テキストを描画できませんよね。
でも、どうしてもひらがなのデータを確認用に表示したくなりまして・・・

だったらローマ字で表示すればいいんじゃない?

というわけで、全角ひらがなを半角ローマ字に変換するプログラムを書きました。
今回はmapを使って実装してみました。

環境はLinux(Fedora)で、文字コードはUTF-8です。
それ以外の環境の場合はStringComparatorをいじる必要があります。

toStringの説明はC++で色々なデータ型をstringに変換
StringComparatorの説明はC++で全角と半角の混じった文字から1文字ずつ取り出すを参照してください。

ソースコードは↓より

今回は長くなったのでテキストファイルも付けておきました。ブログの仕様上拡張子を".txt"に変えてあるので、拡張子を".hpp"か".cpp"に変えて使用してください。

toString.hpp
StringComparator.hpp
HiraganaConvertor.hpp
HiraganaConvertor.cpp

Windowsの方はこちらを(shift-JIS)
toString.hpp
StringComparator.hpp
HiraganaConvertor.hpp
HiraganaConvertor.cpp



クラス宣言部

/*「<」の後のスペースを消してください*/

#include < string>
#include < vector>
#include < ctype.h>
#include < map>
#include < sstream>

using namespace std;

template < class Temp>
string toString(Temp t)
{
stringstream ss;
ss << t;
return ss.str();
}

class StringComparator
{
public:
static vector< string> comparate(string inStr);
};


class HiraganaConverter
{
private:
map< string,string> dic;

string cellConvert(string str);

public:
HiraganaConverter(){init();}

void init();

string convert(vector< string> sList);
string convert(string str);
};





中身


/*「<」の後のスペースを消してください*/
vector< string> StringComparator::comparate(string inStr)
{
vector< string> sList;

int count = 0; // 全角が始まってからのカウンタ
char bufC[10]; // 全角保存用
bool isLastFULL = false; // 前回の文字が全角かどうか

// clear list
sList.clear();

for(int i=0;i< (int)inStr.length(); i++)
{
// 今回が半角
if(inStr.at(i) > 0)
{
// 前回が全角
if(isLastFULL)
{
bufC[count] = '\0';
sList.push_back( toString(bufC) );
}

sList.push_back( toString(inStr.at(i)) );

// 変数のリセット
isLastFULL = false;
count = 0;
}

// 今回が全角
else
{
if(count == 3)
{
bufC[count] = '\0';
sList.push_back( toString(bufC) );
count = 0;
}

isLastFULL = true;
bufC[count++] = inStr.at(i);
}
}

// 最後の文字が全角だった場合
if(isLastFULL)
{
bufC[count] = '\0';
sList.push_back( toString(bufC) );
}

return sList;
}

string HiraganaConverter::convert(string str)
{
return convert( StringComparator::comparate(str) );
}

string HiraganaConverter::convert(vector< string> sList)
{
string convertedStr="";

// ローマ字に変換
for(int i=0;i< (int)sList.size(); i++)
{
// 最後の一文字でないとき
if(i < ((int)sList.size()-1))
{
// "っ"の処理 例)"っか" → "kka"
if( sList[i] == "っ")
{
convertedStr += cellConvert(sList[i+1]).at(0);
continue;
}

// "ゃ"、"ゅ"、"ょ"の処理   例) "じゃ" → "zya"
else if(sList[i] == "ゃ"|| sList[i] == "ゅ"|| sList[i] == "ょ")
{
if(convertedStr.size() > 1)
{
convertedStr.erase( convertedStr.size() - 1, 1 );
}
}
}

// その他(リストから変換)
convertedStr += (sList[i].size() > 1) ? cellConvert(sList[i]) : sList[i];

}

return convertedStr;
}


string HiraganaConverter::cellConvert(string str)
{
map< string,string>::iterator it = dic.find(str);

// 変換できない文字はそのまま返す
return ( it != dic.end() ) ? it->second : str;
}


void HiraganaConverter::init()
{
dic.insert( map< string,string>::value_type("あ","a") );
dic.insert( map< string,string>::value_type("い","i") );
dic.insert( map< string,string>::value_type("う","u") );
dic.insert( map< string,string>::value_type("え","e") );
//以下略 ソースコード参照
}




使い方は簡単で、


HiraganaConverter hiragana;
string before = "みっくみくにshiteやんよ";
string after;

// afterに"mikkumikunishiteyannyo"という文字列が代入される
after = hiragana.convert(before);
printf("%s",after.c_str());


例のようにひらがな以外の文字が入っていたら元の文字が出力されます。
ですから、半角文字が混じっていても大丈夫です。

<参考サイト様>
・http://www.geocities.jp/ky_webid/cpp/library/010.html
・http://www.cplusplus.com/reference/stl/map/find/
関連記事

theme : プログラミング
genre : コンピュータ

comment

Secret

プロフィール

シロマ=ナノ

Author:シロマ=ナノ
参加予定イベント:
 ・C91 3日目西め28a

DIVA-AC:
 LV.199 白のシンフォニア

Flashカレンダー
Twitter
カテゴリ
最新記事
PCLクレジット
当ブログは、ピアプロ・キャラクター・ライセンス(http://piapro.jp/license/pcl)に基づいて、クリプトン・フューチャー・メディア株式会社のキャラクター 「初音ミク」「鏡音リン」「鏡音レン」「巡音ルカ」「Meiko」「Kaito」及びそれらに依拠して制作されたキャラクター「亞北ネル」「弱音ハク」を描いた作品を公開しています。
アクセスカウンター
検索フォーム
主な作品
WindowHelper(フリーソフト)
WindowHelperポップ

描いた絵・イラスト
リンク
バナー
当サイトはリンクフリーです。
バナーを使用したい場合は以下の画像をお使い下さい。
(リンク先に200x40サイズを置いてあります)

・通常版
banner

・ミク版
banner
RSSリンクの表示
ブロとも申請フォーム

この人とブロともになる

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。