-1

みなさん、こんにちは。だから私はまだこのシーンに慣れていませんが、かなりの野心を持っており、できる限り多くのことを学ぼうとしています。私は自分自身を C++ に熟達していると考えていますが、常に DOS プログラムをプログラミングしており、最近は Windows API に視野を広げています.... そうは言っても、Windows API が UNI と大きく絡み合っていることに気付きました。 DOS は ANSI を使用していましたが、CODE は ANSI を使用していたので、ANSI は 8 ビットの文字コードを使用し、UNI-CODE は 16 ビットを使用していることがわかります。私の質問は次のとおりです。

1) なぜこれが重要なのですか.. 16 ビットと 8 が対になっているため、より具体的であるか、より多くの情報を保持できるのでしょうか? つまり、ANSI がサポートしていない UNI-CODE がサポートしている文字がいくつかあることは知っていますが、それは何ですか??

2) TCHAR と WCHAR の違いは何ですか? それは単なる 16 ビット版の char ですか? WCHAR がワイド文字の場合、TCHAR は何ですか?

3) LPWSTR がワイド文字列への長いポインタであることは理解していますが、いつこれを使用しますか?またその理由は? それは単にWindowsのものですか?長いポインターは自動的に16ビットではありませんか?それは、通常のポインターが8ビットであることを意味しますか? もしそうなら、なぜ余分なビットが必要なのですか?

4) 次に、なぜ wstring が必要なのですか?また、特定の関数で wchar と tchar を使用する必要があるのはなぜですか? すなわち

wstring myStr;
TCHAR myChar;
if (myStr.find(myChar) != string::npos) { krmormrm }

またはそれは問題ですか..

char myChar;
if (myStr.find(myChar) != string::npos) { jnrnikvnr }

5) 最後になりましたが、変換なしで WCHAR と wstring または int を表示するのに問題がありました。

WCHAR myChar = '1';
int i = 2;
wstring myString;

ofstream File1("myFile.txt");

if (File1.is_open())
{
    File1 << (char)myChar; //if i didn't typecast it to char it displayed 49 instead of 1;
    File1 << (WCHAR)i; //if i didn't typecast it to WCHAR(like to char instead)it displays symbols

    WCHAR temp;
    copy(myString.begin(), myString.end(), temp);

    File1 << (char)temp;
}

わかりましたので、wstringとコピーに少し問題がありました。私が実際のプログラムで行ったこと (これは簡単なスクリプトにすぎません) は、9 つ​​の WCHAR 変数を取りました... wstringstreamを使用して、それらすべてをその変数 (wss) にロードし、次にmyString (私の wstring 変数) にロードしました...それらがすべて正しくロードされたことを確認して、それをWCHAR一時にコピーしてfile1に送信したので、ロードされたものを物理的に確認できましたが、何らかの理由で、必要な変数と不要な追加変数をロードし、コードを何度も調べましたそして、何も問題が見つかりませんでした..だから私はコピー機能を取り除き、次のようなforループで各変数を個別に表示しました:

for (int i = 0; i < 81; i++)
{
    File1 << "Box " << (WCHAR)i << ": " << (char)BoxNum[i] << "\n";
}

そして、すべてが正しい値を保持していると結論付けました...参考までに、値をテキストボックスに入力し、テキストを取得して個々の変数に保存していました..テキストボックスは9つずつ並んでいます...行と列の9...そして、最初の行のボックスの変数を使用してmyStringに入れたので、string.find()関数を使用して、ボックスの代わりにその行の数字をチェックできましたボックスで..私の問題はこのwstringを表示していました......とにかく笑できるだけ多くの情報を提供しようとして申し訳ありませんが、誰かが私のためにその問題を解決できるかもしれません。

4

1 に答える 1

1
  1. 8 ビット文字エンコーディングでは、多くの制御文字を除いて、256 種類の文字しか使用できません。英語の場合はこれで十分ですが、 や などの奇妙な文字を含む他のヨーロッパ言語をカバーしたい場合ößéø、これだけでは十分ではありません。確かに、8 ビット エンコーディングの上位 128 コードポイントに異なる文字を配置するさまざまなコードページを使用できますが、同じ文字列に複数の言語を混在させる必要がある場合はどうすればよいでしょうか? また、256 文字をはるかに超える中国語などの言語についてはどうでしょうか。しかし、1 文字あたり 16 ビットの場合、60,000 を超えるコードポイントを使用できます。これは、単一のコードページで基本的な多言語面全体をカバーするのに十分です。

  2. WCHARは常に 16 ビットですTCHARは、プログラムを Unicode プログラムとしてコンパイルするかどうかに応じて、8 ビットまたは 16 ビットにすることができます。

  3. ロングポインターとショートポインターの違いは、ほとんど歴史的なものであり、最新のプラットフォームではあまり問題になりません (本当に知りたい場合は、この質問を確認してください)。Windows API には、最初の Windows バージョンにまでさかのぼる非常に長い遺産があるため、そこには多くの時代遅れの遺物があります。ポインタの長さは、プログラムの種類によって異なります。32 ビット プログラムには 32 ビット長のポインターがあり、64 ビット プログラムには 64 ビット長のポインターがあります。プログラムを 64 ビット用にコンパイルすると、LPWSTRは 64 ビット ポインターになります (16 ビット文字のヌル終了配列への)。

  4. 最初のコードは、TCHAR が 16 ビットの場合にのみ機能します。その場合、WCHAR と TCHAR は同じものだからです。TCHAR が 8 ビットの場合、find メソッドは文字列の作成元と同じ型を必要とするため、そのコードはコンパイルされません。

  5. 16 ビット文字列をファイルに書き込むと、16 ビット文字列としてファイルに書き込まれます。その後、テキスト エディターで開いてゴミしか表示されない場合は、テキスト エディターが 8 ビットの文字エンコーディングで解釈している可能性があります。テキスト エディターのエンコーディングを、ファイルを記述したエンコーディングに切り替えます (UTF-16 が機能する場合があります)。または、この質問で説明されているように、書き込む前にwstringを aに変換します。ただし、文字列に 8 ビットで表現できない文字が含まれている場合、これはうまく機能しないことに注意してください。string

于 2014-10-25T22:39:02.260 に答える