1

タイプライターのアポストロフィ(')ではなく、不吉な活版印刷のアポストロフィ(')を処理するときに、奇妙な動作に遭遇しました。ワイド文字列リテラルとともに使用されるアポストロフィは、wofstreamを中断します。

このコードは機能します

ofstream file("test.txt");
file << "A’B" ;
file.close();

==> A'B

このコードは機能します

wofstream file("test.txt");
file << "A’B" ;
file.close();

==> A'B

このコードは失敗します

wofstream file("test.txt");
file << L"A’B" ;
file.close();

==> A

このコードは失敗します...

wstring test = L"A’B";
wofstream file("test.txt");
file << test ;
file.close();

==> A

何か案が ?

4

3 に答える 3

1

wofstreamを使用する前に、ロケールを「有効」にする必要があります。

std::locale::global(std::locale()); // Enable locale support 
wofstream file("test.txt");
file << L"A’B";

したがって、システムロケールがあるen_US.UTF-8場合、ファイルtest.txtにはutf8エンコードデータ(4バイト)が含まれます。システムロケールがある場合en_US.ISO8859-1、ISO 8859-1がそのような文字を見逃さない限り、ファイルは8ビットエンコード(3バイト)としてエンコードされます。

wofstream file("test.txt");
file << "A’B" ;
file.close();

このコード"A’B"は、実際にはutf-8文字列であり、utf-8文字列をバイトごとにファイルに保存するために機能します。

注: OSのようなPOSIXを使用していて、デフォルトのロケールである「C」とは異なるデフォルトのロケールがあることを前提としています。

于 2009-05-03T08:54:13.807 に答える
0

「壊れている」のは、ソースファイル内のUnicode文字に対するコンパイラのサポートではないのですか?\x文字列リテラルの文字をエンコードするために使用するか、または同様の場合はどうなりますか?wchar_tソースファイルは、コンパイラにとってどのようなエンコーディングである可能性がありますか?

于 2009-05-03T02:05:00.717 に答える
0

ストリーム挿入文字をブロックでラップしてみて、try-catchスローされる例外がある場合はそれを教えてください。

ここで何が起こっているのかわかりませんが、とにかく推測に嫌がらせをします。活版印刷のアポストロフィは、おそらく1バイトに収まる値を持っています。これ"A’B"は、基礎となるエンコーディングを気にせずにバイトを盲目的にコピーするため、で機能します。ただし、を使用するL"A’B"と、実装に依存するエンコーディング係数が機能します。この特定の文字を格納するための適切なUTF-16(Windowsを使用している場合)またはUTF-32(* nix / Macを使用している場合)の値が見つからない可能性があります。

于 2009-05-03T07:05:43.707 に答える