C 文字列操作 新しいページはコチラ

提供: yonewiki
移動: 案内, 検索
(文字列半角文字全角文字変換)
(文字列大文字小文字変換)
3,068行: 3,068行:
 
これは、まぁ関数がありますので簡単に実現できます。
 
これは、まぁ関数がありますので簡単に実現できます。
 
aBcdEfgに書かれているものをABCDEFGに変換したり、あるいはabcdifgに変換したりできます。AbCDeFGみたいに入れ替えたり、英語の自然表記のため文章の始めの文字を探したり、略語や固有名詞の先頭文字を大文字にし、そのほかを小文字にするのはまた別の話になります。入れ替えくらいなら機械的な操作なのでやれると思います。大文字と小文字を同一視する必要のある検索の一致や大文字と小文字を区別しないメールアドレスやドメイン名の文字列変換に利用することもあります。この変換にも先述したICUを利用することができますが、この程度であれば標準関数を利用した方がよいです。DLLファイルを配ったり、プロジェクトにLibライブラリを読み込んだりINCLUDEファイルを設定したり、大きな実行ファイル群を要することになります。どうせ配布するならICUを使った方がよかったりする場合もありますので、ケースバイケースでしょうか?
 
aBcdEfgに書かれているものをABCDEFGに変換したり、あるいはabcdifgに変換したりできます。AbCDeFGみたいに入れ替えたり、英語の自然表記のため文章の始めの文字を探したり、略語や固有名詞の先頭文字を大文字にし、そのほかを小文字にするのはまた別の話になります。入れ替えくらいなら機械的な操作なのでやれると思います。大文字と小文字を同一視する必要のある検索の一致や大文字と小文字を区別しないメールアドレスやドメイン名の文字列変換に利用することもあります。この変換にも先述したICUを利用することができますが、この程度であれば標準関数を利用した方がよいです。DLLファイルを配ったり、プロジェクトにLibライブラリを読み込んだりINCLUDEファイルを設定したり、大きな実行ファイル群を要することになります。どうせ配布するならICUを使った方がよかったりする場合もありますので、ケースバイケースでしょうか?
 +
 +
とりあえずは、ICUの方の変換を記載しておきます。
 +
<syntaxhighlight lang="cpp" line start="1">
 +
#pragma once
 +
 +
#include "stdafx.h"
 +
#include <stdlib.h>
 +
#include <string> //std::string型定義
 +
#include <mbstring.h> //mbs***関数
 +
#include <iostream> //cpp cout etc 一般入出力関数
 +
#include <locale> //Locale関数
 +
#include <tchar.h> //TCHAR型+_tcs***関数
 +
#include "atlstr.h" //CString,CStringA,CStringWおよびLPTSTR,LPWSTR,LPSTR,LPCTSTR,LPCWSTR,LPCSTRの定義プリプロセッサ
 +
#include "atlbase.h" //同上
 +
#include "cstringt.h" //CStringTの定義プリプロセッサ
 +
 +
//_bstr_t型を利用するプリプロセッサ
 +
#include "comutil.h"
 +
#ifdef _DEBUG
 +
#pragma comment(lib, "comsuppwd.lib")
 +
#else
 +
#pragma comment(lib, "comsuppw.lib")
 +
#endif
 +
//_bstr_t
 +
 +
//ICU ucnvプリプロセッサ
 +
#include <unicode/ucnv.h>
 +
#include <unicode/translit.h>
 +
#ifdef _DEBUG
 +
//#pragma comment(lib, "icudt.lib")
 +
#pragma comment(lib, "icuind.lib")//ICU Transliterate関数を使うために必要なライブラリ 正規表現関数も
 +
#pragma comment(lib, "icuucd.lib")//ICU ucnvを使うために必要なライブラリ
 +
//#pragma comment(lib, "icuiod.lib")
 +
#else
 +
//#pragma comment(lib, "icudt.lib")
 +
#pragma comment(lib, "icuind.lib")
 +
#pragma comment(lib, "icuuc.lib")
 +
//#pragma comment(lib, "icuio.lib")
 +
#endif
 +
 +
 +
using namespace std;
 +
 +
{
 +
  _tsetlocale(LC_ALL, _T("Japanese"));
 +
 +
 +
  //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 +
  // 全角 → 半角変換
 +
  //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 +
  UErrorCode errorNum = U_ZERO_ERROR;
 +
  int nStrSize;
 +
 
 +
  //変換元となる全角リテラル
 +
  std::wstring wstringResult = L"あいうえおアイウエオABCDE@;:*+/";
 +
  UnicodeString str(wstringResult.c_str());//変換関数にはUnicodeString型を使うので初期値関数を使って初期化。strは変更可能な変数である必要がある。ココでconstは駄目。
 +
 +
  //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 +
  // 半角 → 全角変換
 +
  //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 +
  str = L"あいうえおアイウエオABCDE@;:*+/";
 +
  Transliterator *myTrans = myTrans->createInstance(L"Halfwidth-Fullwidth", UTRANS_FORWARD, errorNum);
 +
  myTrans->transliterate(str);
 +
  printf("★半角 → 全角変換\n");
 +
  wprintf(L"%s:\n",str.getTerminatedBuffer());
 +
  printf("\n");
 +
 
 +
  //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 +
  // 小文字 → 大文字変換
 +
  //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 +
  str = L"AbcDefGhiJKlmloPQRsTUvWxYzabcDeFgHiJkLmNoPQRstuvwxyZ";
 +
  //delete[] myTrans;
 +
  myTrans = myTrans->createInstance(L"lt-Upper", UTRANS_FORWARD, errorNum);
 +
  myTrans->transliterate(str);
 +
  printf("★小文字 → 大文字変換\n");
 +
  wprintf(L"%s:\n",str.getTerminatedBuffer());
 +
  printf("\n");
 +
 +
 +
  //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 +
  // 大文字 → 小文字変換
 +
  //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 +
  str = L"AbcDefGhiJKlmloPQRsTUvWxYzabcDeFgHiJkLmNoPQRstuvwxyZ";
 +
  //delete[] myTrans;
 +
  myTrans = myTrans->createInstance(L"lt-Lower", UTRANS_FORWARD, errorNum);
 +
  myTrans->transliterate(str);
 +
  printf("★大文字 → 小文字変換\n");
 +
  wprintf(L"%s:\n",str.getTerminatedBuffer());
 +
  printf("\n");
 +
 +
  //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 +
  // カタカナ → ひらがな変換
 +
  //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 +
  str = L"あいうえおアイウエオギャギュギョアイウエオABCDE@;:*+/";
 +
  //delete[] myTrans;
 +
  printf("★カタカナ → ひらがな\n");
 +
  wprintf(L"%s:\n",str.getTerminatedBuffer());
 +
  myTrans = myTrans->createInstance(L"Katakana-Hiragana", UTRANS_FORWARD, errorNum);
 +
  myTrans->transliterate(str);
 +
  wprintf(L"%s:\n",str.getTerminatedBuffer());
 +
  printf("\n");
 +
 +
  //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 +
  // ひらがな → カタカナ変換
 +
  //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 +
  str = L"あいうえおぎゃぎゅぎょアイウエオギャギュギョアイウエオABCDE@;:*+/";
 +
  //delete[] myTrans;
 +
  printf("★ひらがな → カタカナ\n");
 +
  wprintf(L"%s:\n",str.getTerminatedBuffer());
 +
  myTrans = myTrans->createInstance(L"Hiragana-Katakana", UTRANS_FORWARD, errorNum);
 +
  myTrans->transliterate(str);
 +
  wprintf(L"%s:\n",str.getTerminatedBuffer());
 +
  printf("\n");
 +
 +
  //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 +
  // ひらがな → カタカナ→半角変換
 +
  //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 +
  str = L"あいうえおぎゃぎゅぎょアイウエオギャギュギョアイウエオABCDE@;:*+/";
 +
  //delete[] myTrans;
 +
  printf("★ひらがな → カタカナ→半角変換\n");
 +
  wprintf(L"%s:\n",str.getTerminatedBuffer());
 +
  myTrans = myTrans->createInstance(L"Hiragana-Katakana", UTRANS_FORWARD, errorNum);
 +
  myTrans->transliterate(str);
 +
  myTrans = myTrans->createInstance(L"Fullwidth-Halfwidth", UTRANS_FORWARD, errorNum);
 +
  myTrans->transliterate(str);
 +
  wprintf(L"%s:\n",str.getTerminatedBuffer());
 +
  printf("\n");
 +
 +
  //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 +
  // ひらがな → ローマ字変換
 +
  //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 +
  str = L"あいうえおぎゃぎゅぎょアイウエオギャギュギョアイウエオABCDE@;:*+/";
 +
  //delete[] myTrans;
 +
  printf("★ひらがな → ローマ字変換\n");
 +
  wprintf(L"%s:\n",str.getTerminatedBuffer());
 +
  myTrans = myTrans->createInstance(L"Hiragana-Latin", UTRANS_FORWARD, errorNum);
 +
  myTrans->transliterate(str);
 +
  wprintf(L"%s:\n",str.getTerminatedBuffer());
 +
  printf("\n");
 +
 +
 +
  //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 +
  // カタカナ → ローマ字変換
 +
  //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 +
  str = L"あいうえおアイウエオギャギュギョアイウエオABCDE@;:*+/";
 +
  //delete[] myTrans;
 +
  printf("★カタカナ → ローマ字変換\n");
 +
  wprintf(L"%s:\n",str.getTerminatedBuffer());
 +
  myTrans = myTrans->createInstance(L"Katakana-Latin", UTRANS_FORWARD, errorNum);
 +
  myTrans->transliterate(str);
 +
  wprintf(L"%s:\n",str.getTerminatedBuffer());
 +
  printf("\n");
 +
 +
  //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 +
  // ローマ字 → ひらがな変換
 +
  //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 +
  str = L"aiueogyagyugyochachuchepyapyupyovuzazishikemeアイウエオギャギュギョアイウエオABCDE@;:*+/";
 +
  //delete[] myTrans;
 +
  printf("★ローマ字 → ひらがな変換\n");
 +
  wprintf(L"%s:\n",str.getTerminatedBuffer());
 +
  myTrans = myTrans->createInstance(L"Latin-Hiragana", UTRANS_FORWARD, errorNum);
 +
  myTrans->transliterate(str);
 +
  wprintf(L"%s:\n",str.getTerminatedBuffer());
 +
  printf("\n");
 +
 +
  //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 +
  // ローマ字 → カタカナ変換
 +
  //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 +
  str = L"aiueogyagyugyochachuchepyapyupyovuzazishikemeアイウエオギャギュギョアイウエオABCDE@;:*+/";
 +
  //delete[] myTrans;
 +
  printf("★ローマ字 → カタカナ変換\n");
 +
  wprintf(L"%s:\n",str.getTerminatedBuffer());
 +
  myTrans = myTrans->createInstance(L"Latin-Katakana", UTRANS_FORWARD, errorNum);
 +
  myTrans->transliterate(str);
 +
  wprintf(L"%s:\n",str.getTerminatedBuffer());
 +
  printf("\n");
 +
 +
  //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 +
  // ローマ字 → カタカナ→半角変換
 +
  //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 +
  str = L"aiueogyagyugyochachuchepyapyupyovuzazishikemeアイウエオギャギュギョアイウエオABCDE@;:*+/";
 +
  //delete[] myTrans;
 +
  printf("★ローマ字 → カタカナ→半角変換\n");
 +
  wprintf(L"%s:\n",str.getTerminatedBuffer());
 +
  myTrans = myTrans->createInstance(L"Latin-Katakana", UTRANS_FORWARD, errorNum);
 +
  myTrans->transliterate(str);
 +
  myTrans = myTrans->createInstance(L"Fullwidth-Halfwidth", UTRANS_FORWARD, errorNum);
 +
  myTrans->transliterate(str);
 +
  wprintf(L"%s:\n",str.getTerminatedBuffer());
 +
  printf("\n");
 +
 +
}
 +
 +
</syntaxhighlight>
  
 
=='''文字列半角文字全角文字変換'''==
 
=='''文字列半角文字全角文字変換'''==

2014年10月1日 (水) 00:00時点における版



個人用ツール
名前空間

変種
操作
案内
ツールボックス