C 文字列操作 新しいページはコチラ
提供: yonewiki
(→文字列文字コード変換) |
(→文字列文字コード変換) |
||
2,673行: | 2,673行: | ||
プロジェクトの設定は以上です。以下が実際の変換サンプルになります。これまでのサンプルもそうですが、実際にはサポートクラスを作って、毎回新しく変数定義しているものは、クラスを呼ぶたびにまとめて生成されるようなセットを作るべきです。変換サポートクラスの作り方については、クラスに関する記述を掘り下げるセクションで触れたいと思いますが、ここでは例のごとく直線的なプログラムになっています。 | プロジェクトの設定は以上です。以下が実際の変換サンプルになります。これまでのサンプルもそうですが、実際にはサポートクラスを作って、毎回新しく変数定義しているものは、クラスを呼ぶたびにまとめて生成されるようなセットを作るべきです。変換サポートクラスの作り方については、クラスに関する記述を掘り下げるセクションで触れたいと思いますが、ここでは例のごとく直線的なプログラムになっています。 | ||
+ | <syntaxhighlight lang="cpp" line start="1"> | ||
+ | #include "stdafx.h" | ||
+ | #include <unicode/ucnv.h> | ||
+ | #include <stdlib.h> | ||
+ | #include <string> | ||
+ | #include <mbstring.h> | ||
+ | #include <iostream> | ||
+ | #include <locale> | ||
+ | #include <tchar.h> | ||
+ | #include "atlstr.h"//CString,CStringA,CStringWおよびLPTSTR,LPWSTR,LPSTR,LPCTSTR,LPCWSTR,LPCSTRの定義プリプロセッサ | ||
+ | #include "cstringt.h"//CStringTの定義プリプロセッサ | ||
+ | #include "atlbase.h" | ||
+ | #include "comutil.h" | ||
+ | using namespace std; | ||
+ | |||
+ | int _tmain(int argc, _TCHAR* argv[]) | ||
+ | { | ||
+ | _tsetlocale(LC_ALL, _T("Japanese")); | ||
+ | |||
+ | |||
+ | |||
+ | // "JIS文字列" のJIS(iso-2022-jp)表現↓ | ||
+ | string jis = "\x4A\x49\x53\x1B\x24\x42\x4A\x38\x3B\x7A\x4E\x73\x1B\x28\x42"; | ||
+ | wstring wstr = L"JIS文字列"; | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ | ||
+ | // JIS → UNICODE | ||
+ | //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ | ||
+ | UConverter* ucnvTest; | ||
+ | UErrorCode uerrorNum; | ||
+ | int nStrSize; | ||
+ | int nStrResultSize; | ||
+ | nStrSize = jis.size(); | ||
+ | |||
+ | std::wstring stringCnvResult(nStrSize, L'\0'); | ||
+ | |||
+ | ucnvTest = ucnv_open("iso-2022-jp", &uerrorNum); | ||
+ | nStrResultSize = ucnv_toUChars( | ||
+ | ucnvTest, | ||
+ | &stringCnvResult[0], stringCnvResult.size(), // 変換先のポインタとサイズ | ||
+ | &jis[0], nStrSize, // 変換元のポインタとサイズ | ||
+ | &uerrorNum | ||
+ | ); | ||
+ | stringCnvResult.resize(nStrResultSize); | ||
+ | ucnv_close(ucnvTest); | ||
+ | _tprintf(_T("%s\n"), stringCnvResult.c_str()); | ||
+ | |||
+ | |||
+ | wchar_t* pwcStr = new wchar_t[_tcslen(stringCnvResult.c_str()) + 1]; | ||
+ | _tcscpy_s(pwcStr,_tcslen(stringCnvResult.c_str()) + 1,stringCnvResult.c_str()); | ||
+ | for(int i = 0;i < (int)_tcslen(stringCnvResult.c_str());i++){ | ||
+ | printf("%04x:",*(pwcStr + i)); | ||
+ | } | ||
+ | printf("\n"); | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ | ||
+ | // UNICODE → JIS | ||
+ | //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ | ||
+ | ucnvTest = ucnv_open("iso-2022-jp", &uerrorNum); | ||
+ | |||
+ | nStrSize = wstr.size(); | ||
+ | std::string stringCnvResult2(ucnv_getMaxCharSize(ucnvTest) * nStrSize , L'\0'); | ||
+ | |||
+ | |||
+ | nStrResultSize = ucnv_fromUChars( | ||
+ | ucnvTest, | ||
+ | &stringCnvResult2[0], stringCnvResult2.size(), // 変換先のポインタとサイズ | ||
+ | &wstr[0], nStrSize, // 変換元のポインタとサイズ | ||
+ | &uerrorNum | ||
+ | ); | ||
+ | stringCnvResult2.resize(nStrResultSize); | ||
+ | ucnv_close(ucnvTest); | ||
+ | _tprintf(_T("%s\n"), stringCnvResult2.c_str()); | ||
+ | |||
+ | |||
+ | char* pcStr = new char[strlen(stringCnvResult2.c_str()) + 1]; | ||
+ | strcpy_s(pcStr,strlen(stringCnvResult2.c_str()) + 1,stringCnvResult2.c_str()); | ||
+ | for(int i = 0;i < (int)strlen(stringCnvResult2.c_str());i++){ | ||
+ | printf("%02x:",*(pcStr + i)); | ||
+ | } | ||
+ | printf("\n"); | ||
+ | |||
+ | |||
+ | |||
+ | //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ | ||
+ | // UNICODE → SJIS | ||
+ | //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ | ||
+ | ucnvTest = ucnv_open("shift_jis", &uerrorNum); | ||
+ | |||
+ | nStrSize = wstr.size(); | ||
+ | std::string stringCnvResult3(ucnv_getMaxCharSize(ucnvTest) * nStrSize , L'\0'); | ||
+ | |||
+ | |||
+ | nStrResultSize = ucnv_fromUChars( | ||
+ | ucnvTest, | ||
+ | &stringCnvResult3[0], stringCnvResult3.size(), // 変換先のポインタとサイズ | ||
+ | &wstr[0], nStrSize, // 変換元のポインタとサイズ | ||
+ | &uerrorNum | ||
+ | ); | ||
+ | stringCnvResult3.resize(nStrResultSize); | ||
+ | ucnv_close(ucnvTest); | ||
+ | printf("%s\n", stringCnvResult3.c_str()); | ||
+ | |||
+ | |||
+ | char* pcStr2 = new char[strlen(stringCnvResult3.c_str()) + 1]; | ||
+ | strcpy_s(pcStr2,strlen(stringCnvResult3.c_str()) + 1,stringCnvResult3.c_str()); | ||
+ | for(int i = 0;i < (int)strlen(stringCnvResult3.c_str());i++){ | ||
+ | printf("%02x:",0x000000ff & *(pcStr2 + i)); | ||
+ | } | ||
+ | printf("\n"); | ||
+ | |||
+ | |||
+ | return 0; | ||
+ | } | ||
+ | </syntaxhighlight> | ||
=='''文字列大文字小文字変換'''== | =='''文字列大文字小文字変換'''== |