符号はTSVで管理する

このコンバータは、様々な言語、符号に対応し、それらは主として言語ごとに別々のDLLで処理する。

このため、アプリケーション側は、符号のIDに対応するDLL名を知る必要がある。
CUIと、GUIをそれぞれ用意する予定なので、この一覧表はプログラム内部に持たず、思い切ってIDとDLL名を羅列したTSVファイルで用意することにした。

また、コマンドのオプションとして手動で符号を指定する場合のために、符号名称と符号IDに対応する逆引きのTSVファイルも用意することにした。

古い実装では、双方共にプログラム内部に持っていたが、外部に持たせたほうが利便性が高いだろうと判断した次第。



この処理のために、TSVの処理をしやすいよう、TSVのn番目の文字列を取る、という機能を持った関数を作ってみた。

入力はstd::stringで文字列1行と、0からの番号で、出力はその文字列、となります。


string strGetTSVcolumn(const string &instr, int nColumn)
{
string::size_type loc;

string str = instr;
for (; nColumn > 0; --nColumn)
{
if ((loc = str.find('\t')) != string::npos)
{
str = str.substr(loc+1);
}
else
{
return (std::string)"";
}
}

if ((loc = str.find('\t')) != string::npos)
{
str = str.substr(0, loc);
}

if ((loc = str.find('\r')) != string::npos)
{
str = str.substr(0, loc);
}

return str;
}


C++のstringクラスを使うと、文字列関係でのバッファオーバーフローが無くなるので、とても安全・安心で、便利ですね。
自由に使っていただいて結構ですが、バグってても責任とりません。

これを、例えばTSVstringクラスとかにする場合は、一つ目の&instrの引数を消して、代わりに this->str から得るように変更すると良いかと思います。
弊社の実際の実装では、そのように変更して使っています。


H21/6/12改良
(1) タブが大きい等で項目が無い場合は、空文字列を返却するようにした。
(2) CR+LFのファイルの場合、末端に \r が残ってしまう(UNIX環境の場合)ので、削除するようにした。


2008/11/13(木)19:47 |Comments(0) |Trackback(0)

製造開発 | プログラミング | コンピュータ | [編集]

▲ページトップ

コメント

コメントの投稿

符号管理 ホーム エンコードチェック
トラックバック

この記事にトラックバックする(FC2ブログユーザー)
▲ページトップ

カレンダー

03 | 2017/04 | 05
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 - - - - - -

プロフィール

miraicorp

Author:miraicorp
未来情報産業(株) 社長

主として「ICカードこれひとつ」や「文字、文字コード」処理、時々C++などについて記述しています。

twitterツイッター

管理用

検索フォーム

お知らせ

コメント等お気軽にどうぞ。

気に入ったら拍手して頂けると、今後の記事を書く際の参考や励みになります。

■お仕事を募集しております
ソフトウェア製造の仕事や、原稿執筆の仕事などを随時受け付けております。
お気軽にご相談下さい

■初めての方へ
こまごまと更新しているため、他にも関連する記事があるかもしれません。
「月別アーカイブ」「検索フォーム」「カテゴリ」などをお試し下さい。
トップページはこちら

最新記事

最新コメント

最新トラックバック

月別アーカイブ

カテゴリ

広告枠

メール

メールはこちら

リンク

このブログをリンクに追加する

RSSリンクの表示

QRコード

QR