C 文字列操作 新しいページはコチラ
提供: yonewiki
(→文字列文字コード変換) |
(→文字列半角文字全角文字変換) |
||
| 3,067行: | 3,067行: | ||
=='''文字列半角文字全角文字変換'''== | =='''文字列半角文字全角文字変換'''== | ||
これは、標準関数では対応できませんが、ABCD…UVWXYZ@…abc…xyzをABCD…UVWXYZ@…abc…xyzに変換するような作業です。文字コードによっても求める結果や操作が違うので、ICUを使うのが手っ取り早いでしょう。自分で作成できる範囲の変換処理でもあります。 | これは、標準関数では対応できませんが、ABCD…UVWXYZ@…abc…xyzをABCD…UVWXYZ@…abc…xyzに変換するような作業です。文字コードによっても求める結果や操作が違うので、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 | ||
| + | |||
| + | |||
| + | #include "UnicodeConverter.h" | ||
| + | |||
| + | |||
| + | using namespace std; | ||
| + | int _tmain(int argc, _TCHAR* argv[]) | ||
| + | { | ||
| + | _tsetlocale(LC_ALL, _T("Japanese")); | ||
| + | |||
| + | |||
| + | //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ | ||
| + | // 全角 → 半角変換 | ||
| + | //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ | ||
| + | UConverter* ucnv; | ||
| + | UErrorCode errorNum = U_ZERO_ERROR; | ||
| + | int nStrSize; | ||
| + | |||
| + | //変換元となる全角リテラル | ||
| + | std::wstring wstringResult = L"あいうえおアイウエオABCDE@;:*+/"; | ||
| + | UnicodeString str(wstringResult.c_str());//変換関数にはUnicodeString型を使うので初期値関数を使って初期化。strは変更可能な変数である必要がある。ココでconstは駄目。 | ||
| + | |||
| + | //正しい変換結果確認用のリテラル | ||
| + | std::wstring wstringResult2 = L"あいうえおアイウエオABCDE@;:*+/"; | ||
| + | |||
| + | //変換処理の核となる部分 | ||
| + | //変換タイプリテラル | ||
| + | const UnicodeString convert_type(L"Fullwidth-Halfwidth"); | ||
| + | Transliterator *myTrans = myTrans->createInstance(convert_type, UTRANS_FORWARD, errorNum);//変換方法を設定 | ||
| + | myTrans->transliterate(str);//変換 | ||
| + | |||
| + | ucnv = ucnv_open("shift_jis", &errorNum); | ||
| + | std::string stringResult(str.length() * ucnv_getMaxCharSize(ucnv),'\0');//shift_jisの最大文字サイズと文字数で仮のメモリ確保 | ||
| + | ucnv_close(ucnv); | ||
| + | |||
| + | //UnicodeStringクラスを使った変換例。Unicode→任意の文字コード。 | ||
| + | //但しchar型へしか格納できない変数なのでUnicode→Unicodeのような無意味な変換には適さない。やれるけど… | ||
| + | nStrSize = str.extract(0, str.length(), &stringResult[0], "shift_jis");//stringResultにShift_JISに変換した内容を保管。 | ||
| + | stringResult.resize(nStrSize);//変換によって判明したメモリサイズに再設定 | ||
| + | |||
| + | |||
| + | //UnicodeStringのwchar_w型文字列を格納している先頭アドレスを取得できるメンバ関数。 | ||
| + | printf("★UnicodeString変数の出力サンプル\n"); | ||
| + | wprintf(L"%s:\n",str.getTerminatedBuffer()); | ||
| + | printf("\n"); | ||
| + | |||
| + | //★半角変換+shift_jis変換のバイトコード表示にためにchar型へ代入して出力 | ||
| + | printf("★半角変換+shift_jis変換\n"); | ||
| + | char* pcStr2 = new char[strlen(stringResult.c_str()) + 1]; | ||
| + | strcpy_s(pcStr2,strlen(stringResult.c_str()) + 1,stringResult.c_str()); | ||
| + | printf("%s %d:\n",stringResult.c_str(),strlen(stringResult.c_str()) + 1); | ||
| + | for(int i = 0;i < (int)strlen(stringResult.c_str()) + 1;i++){ | ||
| + | printf("%02x:",0x000000FF & *(pcStr2 + i)); | ||
| + | } | ||
| + | printf("\n"); | ||
| + | printf("\n"); | ||
| + | |||
| + | |||
| + | //★無変換のバイトコード表示にためにw_char型へ代入して出力 | ||
| + | printf("★全角無変換\n"); | ||
| + | wchar_t* pcStr = new wchar_t[wcslen(wstringResult.c_str()) + 1]; | ||
| + | wcscpy_s(pcStr,wcslen(wstringResult.c_str()) + 1,wstringResult.c_str()); | ||
| + | wprintf(L"%s %d:\n",wstringResult.c_str(),wcslen(wstringResult.c_str()) + 1); | ||
| + | for(int i = 0;i < (int)wcslen(wstringResult.c_str()) + 1;i++){ | ||
| + | printf("%02x:",0x0000FFFF & *(pcStr + i)); | ||
| + | } | ||
| + | printf("\n"); | ||
| + | printf("\n"); | ||
| + | |||
| + | |||
| + | //★変換後確認用の手動変換リテラルのバイトコード表示にためにw_char型へ代入して出力 | ||
| + | printf("★手動変換(確認用)\n"); | ||
| + | wchar_t* pcStr3 = new wchar_t[wcslen(wstringResult2.c_str()) + 1]; | ||
| + | wcscpy_s(pcStr3,wcslen(wstringResult2.c_str()) + 1,wstringResult2.c_str()); | ||
| + | wprintf(L"%s %d:\n",wstringResult2.c_str(),wcslen(wstringResult2.c_str()) + 1); | ||
| + | for(int i = 0;i < (int)wcslen(wstringResult2.c_str()) + 1;i++){ | ||
| + | printf("%02x:",0x0000FFFF & *(pcStr3 + i)); | ||
| + | } | ||
| + | printf("\n"); | ||
| + | printf("\n"); | ||
| + | |||
| + | //★変換処理をしたUnicodeのバイトコード表示にためにw_char型へ代入して出力 | ||
| + | printf("★半角変換Unicode版\n"); | ||
| + | wchar_t* pcStr4 = new wchar_t[wcslen(str.getTerminatedBuffer()) + 1]; | ||
| + | wcscpy_s(pcStr4,wcslen(str.getTerminatedBuffer()) + 1,str.getTerminatedBuffer()); | ||
| + | wprintf(L"%s %d:\n",str.getTerminatedBuffer(),wcslen(str.getTerminatedBuffer()) + 1); | ||
| + | for(int i = 0;i < (int)wcslen(str.getTerminatedBuffer()) + 1;i++){ | ||
| + | printf("%02x:",0x0000FFFF & *(pcStr4 + i)); | ||
| + | } | ||
| + | printf("\n"); | ||
| + | printf("\n"); | ||
| + | |||
| + | |||
| + | } | ||
| + | </syntaxhighlight> | ||
=='''文字列ファイルパス操作'''== | =='''文字列ファイルパス操作'''== | ||