おいふぉりーのぶろぐ

きっと趣味のブログに違いないです!!

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告

文字列について整理

今日は C++ で良く扱うと思われる文字列について、文字コード、エンコード(※)とラッパークラスという観点から整理したいと思います。

~よく使う文字コード、エンコード(※)~
Shift JIS … Windows 環境の場合、テキストファイルの内容は普通これですよね。マルチバイト。
UTF-8 … ASCII文字と互換性があるため、非常に処理しやすい。ASCII 文字は1バイト、漢字は3バイト(※程度)で1文字を表す。※1~6バイトのマルチバイト。
UTF-16 … MSDN の資料で Unicode と言ったらこれですよね。2バイト固定(※厳密には、サロゲートペアが使用された場合、4バイト文字も存在する)。

~データタイプ~
(標準)
char … ASCII 文字、マルチバイト用。
wchar_t … ※処理系依存(VC では UTF-16 用)。

(Windows 固有)
CHAR, WCHAR … それぞれ char, wchar_t と同じ。
LPSTR, LPWSTR … それぞれ char*, wchar_t* と同じ。
TCHAR … UNICODE が定義されているとき wchar_t 、定義されていなければ char。
LPTSTR … UNICODE が定義されているとき wchar_t* 、定義されていなければ char*。
BSTR … COM, OLE 関連で使われる。基本的に UTF-16。文字列の先頭に文字列のサイズを保持しており、専用のメモリ管理関数がある。(詳細はBSTR 覚え書きが参考になりました。)

~ラッパークラス~
(標準)
std::string … char 文字列のラッパー。
std::wstring … wchar_t 文字列のラッパー。

(glibmm)
Glib::ustring … UTF-8 文字列のラッパー。 std::string とインターフェースの互換性がある。

(Windows 固有, MFC, ATL)
CString … TCHAR 文字列のラッパー。
CComBSTR … BSTR のラッパー。
_bstr_t … BSTR のラッパー。CComBSTR より改良されているようだが、 Visual C++ 専用らしい?


参考資料
BSTR 覚え書き
VC++ で文字列


Chiharu さんのご指摘により※部分を修正させていただきました。(2007.04.11)
  1. 2007/04/08(日) 00:26:19|
  2. ソフトウェア開発
  3. | トラックバック:0
  4. | コメント:2
<<ラベルのフォントを Glade で設定する方法 | ホーム | IDL から Cファイル、 H ファイルを作成する>>

コメント

UTF-8 と UTF-16

こんにちは。以前 (相当前) 、ブログにコメントを書いていただいた者です。その節はありがとうございました。 (今はあのブログ消しちゃいましたけど)

今日の記事で気になる内容があったので、コメントします。

UTF-8 は、1 文字あたり 1byte ~ 6bytes のマルチバイトです。コードポイントは 32bit に収まるのですが、エンコーディング設計の都合で 6bytes までのマルチバイトとなっています。(文字列の途中の 1byte に注目するだけでマルチバイトの先頭バイトか否か分かる etc)

UTF-8 の説明で、漢字は 1 文字あたり 3bytes と記載がありますが、現状、常用漢字 (といって良いのか微妙ですが) の範囲が 3bytes 程度で収まっているというだけで、4bytes に及ぶ部分にも漢字はありますし、UCS4 の今後の拡張で 5bytes 以上に及ぶ可能性があります。ですので、設計の前提条件として、UTF-8 中の漢字が 3bytes で収まるという見立ては、ちょっと危ないのでは、と思います。

UTF-16 は、UCS2 に収まる文字は 2bytes で表現するのですが、コードポイントが UCS4 に及ぶと、サロゲートペアと呼ばれる機構により、1 文字あたり 2bytes 以上を使用するようになるマルチバイトです。プラットフォームをまたぐ場合はエンディアン問題がある点も注意が必要です。尚、文字コードが 2bytes 固定なのは UCS2 です。

wchar_t については、処理系によって扱いが異なります。MSVC では WCHAR (UTF-16) 相当ですが、これはコンパイルオプションで変更可能ですし、例えば最近の GCC では UCS4 相当となっているようです。

Unicode に関しては、下記を調査されると、もう少しはっきりした定義が見えてくると思います。

・UCS (文字コード)
・UTF (エンコーディング)

もしかすると既に調査済みの上で、有用なサブセットを抽出して記載されているのかも知れません。そうだとすると釈迦に説法状態ですね (^^;
重箱の隅ちっくな書き込みですが、ちょっと気になりましたもので。
  1. 2007/04/08(日) 19:38:21 |
  2. URL |
  3. Chiharu #Q8lMVvK2
  4. [ 編集]

> そうだとすると釈迦に説法状態ですね (^^;
いや、そんなことはありません、ご指摘ありがとうございます。正直、自分のメモ書きとして書いていることもあり、時々、情報がウソ←(それは、マズイだろ?)なこともあるかもしれません。というか、今回は間違いだらけのようですが・・・

というわけで、今回の内容を調べながら修正してみました。

UTF-8・・・漢字は3バイト※程度

UTF-16・・・2バイト固定→※例外.UCS4でサロゲートペア使用時マルチバイト。

wchar_t・・・※最近の GCC では UCS4 相当(これは、初耳でした。)

UCS、UTF・・・文字コード、とそのエンコーディング。
  1. 2007/04/11(水) 00:30:07 |
  2. URL |
  3. Euphorie #-
  4. [ 編集]

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://tm86eublog.blog42.fc2.com/tb.php/188-3a24151f
この記事にトラックバックする(FC2ブログユーザー)

来客数

プロフィール

Euphorie

Author:Euphorie
"おいふぉりー"って呼んでくださいな☆
ハードウェアとかソフトウェアとかの開発に興味があったり。。。
連絡先は上の画像。

最近の記事

最近のコメント

最近のトラックバック

月別アーカイブ

カテゴリー

ブロとも申請フォーム

この人とブロともになる

ブログ内検索

RSSフィード

リンク

このブログをリンクに追加する

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。