C 日本語文字列 新しいページはコチラ

提供: yonewiki
移動: 案内, 検索
(マルチバイト文字列、ワイド文字列)
(マルチバイト文字列、ワイド文字列)
43行: 43行:
 
でも、言いにくいことなんですけど…、いろんな方式をいろんな人が使っている昨今でして、全体的に網羅しておかないと変換とかしないとダメなので、覚えることが多いのも事実です。<br />
 
でも、言いにくいことなんですけど…、いろんな方式をいろんな人が使っている昨今でして、全体的に網羅しておかないと変換とかしないとダメなので、覚えることが多いのも事実です。<br />
 
Unicodeって言う方式もこれです。<br />
 
Unicodeって言う方式もこれです。<br />
 +
Unicodeの符号化方式のUTF-16は、基本的には半角の英数字も含めて、2byteで1文字を表すためメモリは無駄にしますが、変換効率が高いために実行速度が速くなるというメリットがあります。<br />
 +
実行速度の速さにあやかれるほどのプログラムを作るかどうかは未知数です。<br />
 +
 
VisualSutdioのプロジェクトの設定でもUnicode文字列とマルチバイト文字列、どっちも使わないってのが設定できます。<br />
 
VisualSutdioのプロジェクトの設定でもUnicode文字列とマルチバイト文字列、どっちも使わないってのが設定できます。<br />
 
VisualStudioをアクティブにしている状態で[Alt]+[F7]でプロジェクトのプロパティが表示されるダイアログが表示されます。<br />
 
VisualStudioをアクティブにしている状態で[Alt]+[F7]でプロジェクトのプロパティが表示されるダイアログが表示されます。<br />
 
左側のツリー構造から構成プロパティの中の全般を選択すると右側のビュー表示されるリストに文字セットというのがあります。<br />
 
左側のツリー構造から構成プロパティの中の全般を選択すると右側のビュー表示されるリストに文字セットというのがあります。<br />
 
リストには「Unicode文字セットを使用する/マルチバイト文字セットを使用する/設定なし」の3つがあり、ここで選択した設定にしたがって<br />
 
リストには「Unicode文字セットを使用する/マルチバイト文字セットを使用する/設定なし」の3つがあり、ここで選択した設定にしたがって<br />
TCHAR型という文字列変数を定義することで、設定にしたがって、マルチバイトおよびUnicodeを判別してコンパイルしてくれます。<br />
+
Visual C++だけの機能になりますが、TCHAR型という文字列変数を定義することで、設定にしたがって、マルチバイトおよびUnicodeを判別してコンパイルしてくれます。<br />
 
因みにワイド文字列型では、wchar_t型というのを使うのですが、TCHAR型は、Unicode設定だとwchar_tに置き換わることになります。<br />
 
因みにワイド文字列型では、wchar_t型というのを使うのですが、TCHAR型は、Unicode設定だとwchar_tに置き換わることになります。<br />
 
<br />
 
<br />
131行: 134行:
 
テキストエディタは、このあたりの解釈が厳密で、ファイルを保存するときにも文字コードセットと符号化方式を遵守していますし、<br />
 
テキストエディタは、このあたりの解釈が厳密で、ファイルを保存するときにも文字コードセットと符号化方式を遵守していますし、<br />
 
互換性を高めているものが、多いです。<br />
 
互換性を高めているものが、多いです。<br />
<br />
 
 
<br />
 
<br />
 
<br />
 
<br />
157行: 159行:
 
とはいっても、世界中にはいろんな型の文字列で操作されますので、いろいろな変換が必要になります。<br />
 
とはいっても、世界中にはいろんな型の文字列で操作されますので、いろいろな変換が必要になります。<br />
 
<br />
 
<br />
 +
ここではwchar_t型で文字列を使うために、TCHAR型を使い、ワイド文字列用の各関数wcsで始まるような関数を使います。<br />
 +
マルチバイト文字列とした場合はchar型でマルチバイト文字列用の各関数_wbやwbで始まるような関数に置き換えられることを意味します。<br />
 +
ってことはstrcpyという文字列コピー関数や、strcat(文字列連結)、strlen(文字列カウント)のようなstrで始まるような<br />
 +
C標準ライブラリ関数は使われないことになります。<br />
 +
<br />
 +
最近は文字列操作関数にxxx_sやxxx_lのようなセキュア思想(本当に安全なのかどうかは不明?使い方よっては間違いだらけのプログラムになる可能性もある)の文字列操作関数がありまして、<br />
 +
大雑把に分類すると文字列操作の関数は上記のようなことから、以下のような文字列操作関数に分類できます。<br />
 +
*strxxx系関数<br />
 +
*マルチバイト文字_mbxxxx関数/mbxxxx関数<br />
 +
*ワイド文字_wcxxxx関数<br />
 +
*Visual C++の _tcxxxx関数<br />
 +
と、_lや_sで終わる関数で<br />
 +
*strxxx_s系関数<br />
 +
*マルチバイト文字_mbxxxx_l関数/mbxxxx_l関数<br />
 +
*ワイド文字_wcxxxx_l関数<br />
 +
*Visual C++の _tcxxxx_l関数<br />
 +
といった同じことをする関数だけで大体8種類くらいあります。<br />
 +
文字列の型で言うと
 +
*char型<br />
 +
*wchar_t型<br />
 +
*TCHAR型(Visual C++)<br />
 +
そして、WinAPIで定義されている<br />
 +
LPCSTR/LPCWSTR/LPCTSTR/LPSTR/LPWSTR/LPTSTR/PCSTR/PCWSTR/PCTSTR/PSTR/PWSTR/PTSTR/<br />
 +
という型…<br />
 +
どれか一つに決めて使うのは自分次第ですが、世界中のプログラマがどれを使うかは、わかりません。<br />
 +
しかもどの関数も微妙に動作が違ったりするので、完全な理解をしようとすると、途方に暮れそうになります。<br />
 +
でも、まぁそれだけの種類があるんだなぁとわかってさえいれば、その都度、変換方法を調べるということができるので、それでいいのかなぁと思ったりもします。<br />
 +
で、文字コードセット変換…リトルエンディアン…ビッグエンディアン…文字コードセットの符号化方式UTF-8/UTF-16/UTF-32その他…<br />
 +
もうね。なんか崩壊してるような気もするけど、やるしかないわなorz<br />
 +
学校で教えてくれるプログラミングがいかにその一部分だけを勉強していたのかを思い知らされる現実。<br />
 +
そして、これを覚えたところでWindowsプログラミングができるわけでもないという、目指すべき頂上の遠さ。<br />
 +
全部を理解しようなんて思わないことですね。必要最低限の装備でどこまで登れるか?登山はあんまりやったことがないのでアレなんすけど<br />
 +
<br />
 +
そんな軽装備で山登りなんて始めたら、<br />
 +
間違いなく死ににいくようなもんです。それでも目指すべきところがあるのならば、頑張るしかないっすね。<br />
  
 
== '''マルチバイト文字列、ワイド文字列の相互変換''' ==
 
== '''マルチバイト文字列、ワイド文字列の相互変換''' ==

2013年11月22日 (金) 00:00時点における版



個人用ツール
名前空間

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