Windows周りの文字型文字列型文字コードのまとめ - inoueshinichi/Wiki_Windows GitHub Wiki

参考

文字コード定義

文字コード 種類 特徴
Shift_JIS マルチバイト文字 半角文字(ASCII) 1byte, 全角文字 2byte
UTF-16 ワイド文字 基本的に全文字 2byte, 一部の文字が4byte. WindowsAPIのコアに使われる
UTF-32 - 全世界の文字の種類を4byteで表現しようとしている
UTF-8 マルチバイト文字 ASCII文字 1byte, 多くの日本語 3byte, 一部の文字 4byte, 全世界の言語を含んで最大1文字 6byte. Unix系の基本文字コード
  • WindowsAPIのコアがUTF-16を使用している限り, WindowsプログラムではUTF-16を使うべき.
  • UTF-8は文字の種類によってバイト数が異なるので, 注意すべき.
  • UTF-8のASCII文字1byte表現とShift_JISの半角文字1byte表現が共通であり, 直接変換できる.

Windowsプログラム内で使用される可能性のある文字(列)型

種類 内容
C/C++言語 C/C++言語の標準組み込み
STL STLライブラリの標準組み込み
Windows-C/C++ MicrosoftがC/C++標準機構に準拠していなかった時期に独自に定義したWindows組み込み
Windows-OLE ※オワコン Object Linking and Embedding. Windowsの機能・仕様の一つで、複数のソフトウェアが連携したり、データを共有したりするための仕組み.
Windows-COM 現役 Component Object Model. OLEの後身. Microsoft社が提唱していた,ソフトウェアの機能を部品化して,外部から日々出して利用する仕組みを定めた技術仕様. 内部実装としてはC++の抽象インターフェースクラスとDLLライブラリで成り立っている. VC++からExcelやWordなどを操作するときに使う. DirectX系はCOMに属するのでゲーム開発などでは現在も主流.
Windows-DCOM 現役 Distributed COM. 拡張COM.
Windows-ActiveX ※オワコン OLEの仕組みをインターネットなどの通信ネットワークを通じて利用できるようにしたもの. 一般的に単にActiveXといった場合には, WebサーバからWebブラウザにソフトウェア部品を送信し, 即座に実行することができる「ActiveXコントロール」(ActiveX Control)のことを指すことが多い.
Windows-ATL 現役 Active Template Library. COMプログラミングを容易に行えるようにMicrosoft社によるテンプレートベースのC++専用ライブラリ. VC++からExcelやWordなどを操作するときに使う.
Windows-MFC ※オワコン Microsoft Foundation Class. Win32APIを利用しやすいように独自クラスでラッパーしたフレームワーク. 現在はWindows-CLI(.Net Framework)が主流のため, 衰退気味だが, 未だにC/C++でGUI実装するときには便利フレームワーク.
Windows-CLI(C++/CLI) ※オワコン Common Library Interface. .Net Framework(COM+新規MicrosoftWindowsAPI)にアクセスする際に使用する(主にC#とのブリッジ). .Net Frameworkはガーベッジコレクション(GC)を実装している. WindowsではGCを実装しているコードをマネージドコード, そうでないコードをアンマネージドコードとして分けている. また, 年代で呼び名が変わる. 2003年以前: C++マネージ拡張, 2003年以降: C++/CLI
Windows-CX(C++/CX) ※オワコン C++/CLIの後継. Windows 8 の Windows ストアで配信するアプリケーション開発に特化した C++ を拡張する構文を持つ.
Windows-WRL 影が薄い Windows Runtime C++ Template Library. ATLの後継. ただし, C++標準に基づく形式で実装されている. 内部ではATLを使用しているが, COM用にATLが提供していたいくつかの機能が省略されている.
Windows-(C++/)WinRT 使いずらい Windows Runtime. WRLの後継. C++17標準に基づく新しい形式で実装されている. ネイティブ拡張であるC++/CX, C#, JavaScript, TypeScriptの開発を支援する. Windows SDK 10.0.17134.0 以降は標準C++も選択できるようになった(C++/WinRT)
  • MicrosoftとしてはCOMと共通基盤ライブラリを持つ.Net Framework(多種多様なプラットフォームにおける共通基盤)をユーザーに利用することを求めている
  • C++ネイティブ開発者は, ATL(Microsoft規定), WRL(標準C++規定), C++/WinRT(標準C++17規定)のAPIを通じて.Net Framework(=COM実装)にアクセスして機能を利用する必要がある
  • C++ネイティブ開発者は, Windowsの中核であるCOMの仕様やAPIを勉強しろ!(DirectXもCOM実装だし...)
  • WindowsOSの真髄は, 共通インターフェース仕様(COM)と共通モジュール(COMに基づいたDLL).

C/C++言語の基本型

文字(列)型 内容
char 1byte. Shift-JISとUTF-8のASCIIに対応.
char16_t 2byte. ワイド文字. UTF-16に対応.
char32_t 4byte. UTF-32に対応.
wchar_t 2byte. char16_tのエイリアス.

STL

文字(列)型 内容
std::string const char* を内部表現に持つ.
std::u16string const char16_t* を内部表現に持つ.
std::u32string const char32_t* を内部表現に持つ.
std::wstring const wchar_t* を内部表現に持つ.

Windows-C/C++

文字(列)型 内容
CAHR charのエイリアス.
WCHAR wchar_tのエイリアス.
TCHAR charとwchar_tを定義済みプリプロセッサによって切り替える型.
PSTR 32bitポインタ型. char*のエイリアス. x86アーキテクチャで使用する.
LPSTR 64bitポインタ型. char*のエイリアス. x64アーキテクチャで使用する.
PCSTR PSTRのconst版. const char*のエイリアス.
LPCSTR LPSTRのconst版. const char*のエイリアス.
PWSTR 32bitポインタ型. WCHAR*のエイリアス. x86アーキテクチャで使用する.
LPWSTR 64bitポインタ型. WCHAR*のエイリアス. x64アーキテクチャで使用する.
PWCSTR PWSTRのconst版. const WCHAR*のエイリアス.
LPWCSTR LPWSTRのconst版. const WCHAR*のエイリアス.
  • #include <tchar.h>でマルチバイト系とワイドバイト系の型特性を操作できる.
  • WinAPI関数の末尾にAが付随するものはCHAR対応.
  • WinAPI関数の末尾にWが付随するものはWCHAR対応.
  • WinAPI関数では, 上記のAとWの両方をプログラム時に切り替えられるようにマクロ関数が定義されている.

Windows-OLE

文字(列)型 内容
OLECHAR WCHARのエイリアス
BSTR OLECHAR*のエイリアス. Visual Basicの文字列型
_bstr_t BSTRのC++ラッパークラス

Windows-COM

文字(列)型 内容
未調査.

Windows-DCOM

文字(列)型 内容
未調査.

Windows-ActiveX

文字(列)型 内容
未調査.

Windows-ATL

文字(列)型 内容
CComBSTR Visual Basic文字列(BSTR)型用のもう1つのC++ラッパークラス
CString CHAR型(マルチバイト文字)とWCHAR型(ワイド文字)を自動変換してくれる文字列クラス. かなり便利. #include <atlstr.h>が必要.

Windows-MFC

文字(列)型 内容
CStringA const CHAR*を内部表現に持つテンプレートクラス
CStringW const WCHAR*を内部表現に持つテンプレートクラス
CStringT 内部表現を指定できるテンプレートクラス. const CHAR*, const WCHAR*, const char16_t*, const char32_t* など
CString CStringAとCStringWを自動切り替えで利用できるクラス. かなり便利.

Windows-CLI(C++/CLI)

文字(列)型 内容
String^ C++/CLI言語でC++から.Net FrameWorkを利用するための拡張. ^はヒープ領域にメモリを格納する意味.C++/CLI言語ではクラスをガーベッジコレクションで破棄させるようにしている.

Windows-CX(C++/CX)

文字(列)型 内容
Platform::String^ (C++/CLI)のヒープ型文字列String^と同じ.
Platform::String オリジナルとしてHSTRING(Windowsランタイム文字列へのハンドル)を背後で操作する. char16 UNICODE テキスト文字の配列.
Platform::StringReference 最小のコピー操作でPlatform::String^ 入力パラメーターから他のメソッドに文字列データを渡すために使用できる最適化の手法.

Windows-WRL

文字(列)型 内容
HString::HString RAIIを利用してHSTRINGハンドルの生存期間を管理する文字列クラス. 内部表現はUTF-16文字のHSTRINGハンドル.

Windows-(C++/)WinRT

文字(列)型 内容
winrt::hstring std::wstringと同じUTF-16 Unicode 文字のシーケンシャル. 加えて, オリジナルとしてHSTRING(Windowsランタイム文字列へのハンドル)を背後で操作する.

HSTRING(Windowsランタイム文字列ハンドル)

  • 各言語で定義される文字列と共通性を持つ | 言語 | 文字列表現 | | :-- | :-- | | WinRT/C++ | winrt::hstring クラス | | C++/CX | Platform::String クラス | | JavaScript | String オブジェクト | | .Net Framework | System.String クラス |
⚠️ **GitHub.com Fallback** ⚠️