文字の標準化処理(全角→半角、半角→全角)

総閲覧回数:4,246,883回 / ブログ拍手:2,821
作品DB等各サービスの機能追加情報や、技術系・面白系記事を中心に提供。
記事の投稿は基本Twitterでも告知させて頂いています。
連絡は作品DBの論客の方なら私書、DB外ユーザの方ならメールTwitterで可能です。
アクセス記録[推移 / PV内訳(過去1日 / 過去1週間) / 外部アクセス元 (昨日 / 過去1週間) / ログイン論客足跡]
プロフィール私書(メール)
   /   /送済
評価(一覧   /)
投票   /共:   /
ファン登録
作品/情報/
DB構築()
ブログ
[書く]
攻略記事リンク集
My Play List
RSS購読
RSS
表示開始年月
分類
全て
1.このサイトについて
2.作品DB開発/運用
3.ホームページ制作技術
4.Perl
5.C言語 / C++
6.検索エンジン&SEO
7.サッカー
8.自分のこと
9.Linux
10.旅行
11.思ったこと
12.パソコン
13.Berkeley DB
14.その他技術系
15.企画
16.スマートフォン
17.鑑賞
18.皆声.jpニュース
19.インターネット業界
20.運用マニュアル(自分用)
21.技術系以外実用書
22.料理
23.ALEXA
24.アニメ
25.会計
26.漫画
27.設計書
28.色々サイト作成
29.サーバー
30.自分専用
31.生活
32.OP/ED/PV
33.ゲーム
34.DB整備
35.新規開始作品紹介
36.英語圏の話題
37.大道芸
38.映画
39.PHP
40.ダイエット
41.Mac
42.JavaScript
43.MySQL
44.介護
45.作品DB作品追加作業
46.BI
47.Web API
48.パフォーマンス
49.インターネットの活用方法
50.Riak
51.Androidアプリ開発
52.Cassandra
53.スパム
54.写真
55.iOSアプリ開発
56.AWS
57.マーケティング
58.Web漫画
59.法律
60.mongodb
61.開発環境整備
62.Google Apps Script
63.meteor
64.Pentaho
65.Ansible
66.VPS
67.技術書メモ
68.Vagrant
69.Docker
70.dokuwiki
71.Apple Watch
72.Webサービス
73.セキュリティ
74.Elastic Search
75.Wordpress
76.クラウド
77.英語
78.MVNO
79.シンガポール
80.マレーシア
81.海外生活
82.海外旅行
83.創作活動
84.コワーキングスペース
日記の主な内容
サイト運営/開発
検索エンジン情報
・技術ネタ(Berkeley DB,
Linux, Perl, サイト作成)等

サイト管理
全まとめ
サーバー管理
定期処理状況
開発予定
削除提案
作品追加依頼
OP/ED追加依頼
OP/ED not found
作品提案承認欄

格言 fromスクライド
この世の理は即ち速さ
20年かければ馬鹿でも
傑作小説を書ける

助けられたら助け返す
それが俺のルール

強くなるには
一番弱い考えをする事だ
そしてその考えに反逆する




右側に何か入れてみるテスト


仕事でのサイト
介護DB
Helpyou
Doctor career
Nurse career
<=次の記事 Apache::access_logの携帯対応のさせ方(個体識別情報記録)
=>前の記事 文字::libiconvのバージョンとC++での使い方

1.
2010/02/18 同日2番目 C言語 / C++ > 文字 > 文字の標準化処理(全角→半角、半角→全角)」
[この書込みのみ表示(記事URL紹介用) / 編集 / 削除 / トラバ送信 / 共有分類に追加(タグ付け)]拍手:1個

文字の半角・全角の標準化処理は、検索や統計処理の為には必須な処理ですが、C++/Cでそういうコードが見つからなかったので自分で書いてみました。

CharConverter.hpp
/* Programmed by Hajime Kurita */
/* URL: https://www.accessup.org/ */
/* This program is for EUC String */

#ifndef INCLUDED_CharConverter
#define INCLUDED_CharConverter

#include <boost/regex.hpp>
#include <iostream>
#include <map>
#include <string>
#include <vector>

using namespace std;

const boost::regex euc_regex("\\A(?:[\\x00-\\x7F]|\\x8E[\\xA1-\\xDF]|[\\xA1\\xB0-\\xCE\\xD0-\\xF3][\\xA1-\\xFE]|\\xA2[\\xA1-\\xAE\\xBA-\\xC1\\xCA-\\xD0\\xDC-\\xEA\\xF2-\\xF9\\xFE]|\\xA3[\\xB0-\\xB9\\xC1-\\xDA\\xE1-\\xFA]|\\xA4[\\xA1-\\xF3]|\\xA5[\\xA1-\\xF6]|\\xA6[\\xA1-\\xB8\\xC1-\\xD8]|\\xA7[\\xA1-\\xC1\\xD1-\\xF1]|\\xA8[\\xA1-\\xC0]|[\\xA9-\\xAF\\xF5-\\xFE][\\xA1-\\xFE]|\\xCF[\\xA1-\\xD3]|\\xF4[\\xA1-\\xA6])\\Z");
class CharConverter{
public:
  CharConverter();
  ~CharConverter(){};
  string Normalize(string);
private:
  map<string,string> normalized_euc;
};
#endif

CharConverter.cpp
/* Programmed by Hajime Kurita */
/* URL: https://www.accessup.org/ */
/* This program is for EUC String */

#include "CharConverter.hpp"

using namespace std;

CharConverter::CharConverter(){
  normalized_euc["。"]="。";
  normalized_euc["、"]="、";
  normalized_euc["「"]="「";
  normalized_euc["」"]="」";
  normalized_euc["・"]="・";
  normalized_euc["ー"]="ー";
  normalized_euc[" "]=" ";
  normalized_euc["ァ"]="ァ";
  normalized_euc["ア"]="ア";
  normalized_euc["ィ"]="ィ";
  normalized_euc["イ"]="イ";
  normalized_euc["ゥ"]="ゥ";
  normalized_euc["ウ"]="ウ";
  normalized_euc["ェ"]="ェ";
  normalized_euc["エ"]="エ";
  normalized_euc["ォ"]="ォ";
  normalized_euc["オ"]="オ";
  normalized_euc["カ"]="カ";
  normalized_euc["キ"]="キ";
  normalized_euc["ク"]="ク";
  normalized_euc["ケ"]="ケ";
  normalized_euc["コ"]="コ";
  normalized_euc["サ"]="サ";
  normalized_euc["シ"]="シ";
  normalized_euc["ス"]="ス";
  normalized_euc["セ"]="セ";
  normalized_euc["ソ"]="ソ";
  normalized_euc["タ"]="タ";
  normalized_euc["チ"]="チ";
  normalized_euc["ッ"]="ッ";
  normalized_euc["ツ"]="ツ";
  normalized_euc["テ"]="テ";
  normalized_euc["ト"]="ト";
  normalized_euc["ナ"]="ナ";
  normalized_euc["ニ"]="ニ";
  normalized_euc["ヌ"]="ヌ";
  normalized_euc["ネ"]="ネ";
  normalized_euc["ノ"]="ノ";
  normalized_euc["ハ"]="ハ";
  normalized_euc["ヒ"]="ヒ";
  normalized_euc["フ"]="フ";
  normalized_euc["ヘ"]="ヘ";
  normalized_euc["ホ"]="ホ";
  normalized_euc["マ"]="マ";
  normalized_euc["ミ"]="ミ";
  normalized_euc["ム"]="ム";
  normalized_euc["メ"]="メ";
  normalized_euc["モ"]="モ";
  normalized_euc["ャ"]="ャ";
  normalized_euc["ヤ"]="ヤ";
  normalized_euc["ュ"]="ュ";
  normalized_euc["ユ"]="ユ";
  normalized_euc["ョ"]="ョ";
  normalized_euc["ヨ"]="ヨ";
  normalized_euc["ラ"]="ラ";
  normalized_euc["リ"]="リ";
  normalized_euc["ル"]="ル";
  normalized_euc["レ"]="レ";
  normalized_euc["ロ"]="ロ";
  normalized_euc["ワ"]="ワ";
  normalized_euc["ヲ"]="ヲ";
  normalized_euc["ン"]="ン";
  normalized_euc["A"]="A";
  normalized_euc["B"]="B";
  normalized_euc["C"]="C";
  normalized_euc["D"]="D";
  normalized_euc["E"]="E";
  normalized_euc["F"]="F";
  normalized_euc["G"]="G";
  normalized_euc["H"]="H";
  normalized_euc["I"]="I";
  normalized_euc["J"]="J";
  normalized_euc["K"]="K";
  normalized_euc["L"]="L";
  normalized_euc["M"]="M";
  normalized_euc["N"]="N";
  normalized_euc["O"]="O";
  normalized_euc["P"]="P";
  normalized_euc["Q"]="Q";
  normalized_euc["R"]="R";
  normalized_euc["S"]="S";
  normalized_euc["T"]="T";
  normalized_euc["U"]="U";
  normalized_euc["V"]="V";
  normalized_euc["W"]="W";
  normalized_euc["X"]="X";
  normalized_euc["Y"]="Y";
  normalized_euc["Z"]="Z";
  normalized_euc["a"]="a";
  normalized_euc["b"]="b";
  normalized_euc["c"]="c";
  normalized_euc["d"]="d";
  normalized_euc["e"]="e";
  normalized_euc["f"]="f";
  normalized_euc["g"]="g";
  normalized_euc["h"]="h";
  normalized_euc["i"]="i";
  normalized_euc["j"]="j";
  normalized_euc["k"]="k";
  normalized_euc["l"]="l";
  normalized_euc["m"]="m";
  normalized_euc["n"]="n";
  normalized_euc["o"]="o";
  normalized_euc["p"]="p";
  normalized_euc["q"]="q";
  normalized_euc["r"]="r";
  normalized_euc["s"]="s";
  normalized_euc["t"]="t";
  normalized_euc["u"]="u";
  normalized_euc["v"]="v";
  normalized_euc["w"]="w";
  normalized_euc["x"]="x";
  normalized_euc["y"]="y";
  normalized_euc["z"]="z";
  normalized_euc["1"]="1";
  normalized_euc["2"]="2";
  normalized_euc["3"]="3";
  normalized_euc["4"]="4";
  normalized_euc["5"]="5";
  normalized_euc["6"]="6";
  normalized_euc["7"]="7";
  normalized_euc["8"]="8";
  normalized_euc["9"]="9";
  normalized_euc["0"]="0";
  normalized_euc["!"]="!";
  normalized_euc["”"]="\"";
  normalized_euc["#"]="#";
  normalized_euc["$"]="$";
  normalized_euc["%"]="%";
  normalized_euc["&"]="&";
  normalized_euc["’"]="'";
  normalized_euc["("]="(";
  normalized_euc[")"]=")";
  normalized_euc["="]="=";
  normalized_euc["^"]="^";
  normalized_euc["|"]="|";
  normalized_euc["¥"]="\\";
  normalized_euc["@"]="@";
  normalized_euc["["]="[";
  normalized_euc[";"]=";";
  normalized_euc[":"]=":";
  normalized_euc["]"]="]";
  normalized_euc[","]=",";
  normalized_euc["."]=".";
  normalized_euc["/"]="/";
  normalized_euc["`"]="`";
  normalized_euc["{"]="{";
  normalized_euc["+"]="+";
  normalized_euc["*"]="*";
  normalized_euc["}"]="}";
  normalized_euc["<"]="<";
  normalized_euc[">"]=">";
  normalized_euc["?"]="?";
  normalized_euc["_"]="_";
  normalized_euc["\t"]=" ";
}

string CharConverter::Normalize(string euc_str){
  string converted_str="";
  string char_str="";
  string last_char="";
  for (string::iterator iter = euc_str.begin(); iter != euc_str.end(); ++iter) {
    char_str+=tolower(*iter);
    if(regex_match(char_str, euc_regex)){
      if(char_str=="゙" && converted_str.length()>=2){
        last_char=converted_str[converted_str.length()-2]+converted_str[converted_str.length()-1];
        if(last_char=="ウ"){
          converted_str.erase(converted_str.length()-2, converted_str.length()-1);
          converted_str.append("ヴ");
        }
        else if(last_char=="カ"){
          converted_str.erase(converted_str.length()-2, converted_str.length()-1);
          converted_str.append("ガ");
        }
        else if(last_char=="キ"){
          converted_str.erase(converted_str.length()-2, converted_str.length()-1);
          converted_str.append("ギ");
        }
        else if(last_char=="ク"){
          converted_str.erase(converted_str.length()-2, converted_str.length()-1);
          converted_str.append("グ");
        }
        else if(last_char=="コ"){
          converted_str.erase(converted_str.length()-2, converted_str.length()-1);
          converted_str.append("ゴ");
        }
        else if(last_char=="サ"){
          converted_str.erase(converted_str.length()-2, converted_str.length()-1);
          converted_str.append("ザ");
        }
        else if(last_char=="シ"){
          converted_str.erase(converted_str.length()-2, converted_str.length()-1);
          converted_str.append("ジ");
        }
        else if(last_char=="ス"){
          converted_str.erase(converted_str.length()-2, converted_str.length()-1);
          converted_str.append("ズ");
        }
        else if(last_char=="セ"){
          converted_str.erase(converted_str.length()-2, converted_str.length()-1);
          converted_str.append("ゼ");
        }
        else if(last_char=="ソ"){
          converted_str.erase(converted_str.length()-2, converted_str.length()-1);
          converted_str.append("ゾ");
        }
        else if(last_char=="タ"){
          converted_str.erase(converted_str.length()-2, converted_str.length()-1);
          converted_str.append("ダ");
        }
        else if(last_char=="チ"){
          converted_str.erase(converted_str.length()-2, converted_str.length()-1);
          converted_str.append("ヂ");
        }
        else if(last_char=="ツ"){
          converted_str.erase(converted_str.length()-2, converted_str.length()-1);
          converted_str.append("ヅ");
        }
        else if(last_char=="テ"){
          converted_str.erase(converted_str.length()-2, converted_str.length()-1);
          converted_str.append("デ");
        }
        else if(last_char=="ト"){
          converted_str.erase(converted_str.length()-2, converted_str.length()-1);
          converted_str.append("ド");
        }
        else if(last_char=="ハ"){
          converted_str.erase(converted_str.length()-2, converted_str.length()-1);
          converted_str.append("バ");
        }
        else if(last_char=="ヒ"){
          converted_str.erase(converted_str.length()-2, converted_str.length()-1);
          converted_str.append("ビ");
        }
        else if(last_char=="フ"){
          converted_str.erase(converted_str.length()-2, converted_str.length()-1);
          converted_str.append("ブ");
        }
        else if(last_char=="ヘ"){
          converted_str.erase(converted_str.length()-2, converted_str.length()-1);
          converted_str.append("ベ");
        }
        else if(last_char=="ホ"){
          converted_str.erase(converted_str.length()-2, converted_str.length()-1);
          converted_str.append("ボ");
        }
      }
      else if(char_str=="゚" && converted_str.length()>=2){
        last_char=converted_str[converted_str.length()-2]+converted_str[converted_str.length()-1];
        if(last_char=="ハ"){
          converted_str.erase(converted_str.length()-2, converted_str.length()-1);
          converted_str.append("パ");
        }
        else if(last_char=="ヒ"){
          converted_str.erase(converted_str.length()-2, converted_str.length()-1);
          converted_str.append("ピ");
        }
        else if(last_char=="フ"){
          converted_str.erase(converted_str.length()-2, converted_str.length()-1);
          converted_str.append("プ");
        }
        else if(last_char=="ヘ"){
          converted_str.erase(converted_str.length()-2, converted_str.length()-1);
          converted_str.append("ペ");
        }
        else if(last_char=="ホ"){
          converted_str.erase(converted_str.length()-2, converted_str.length()-1);
          converted_str.append("ポ");
        }
      }
      else if(normalized_euc.count(char_str)){
        converted_str.append(normalized_euc[char_str]);
      }
      else{
        if(char_str==" "){
          if(converted_str.length()==0 ||
             (iter==euc_str.end()-1) ||
             (converted_str.length()>0 && converted_str[converted_str.length()-1]==' ')
             ){
          }
          else{
            converted_str.append(char_str);
          }
        }
        else{
          converted_str.append(char_str);
        }
      }
      char_str="";
    }
  }
  return converted_str;
}

呼び出し側
#include "CharConverter.hpp"
...
CharConverter char_converter;
...
string normalized_str;
normalized_str=char_converter.Normalize(raw_str);


コメントする
1個


[他の記事も読む]
<=次の記事 Apache::access_logの携帯対応のさせ方(個体識別情報記録)
=>前の記事 文字::libiconvのバージョンとC++での使い方


大分類が「C言語 / C++」の記事
この論客の記事全て
↑上へ