活版印刷のアポストロフィ+ワイド文字列リテラルがwofstreamを壊しました(C ++)

StackOverflow https://stackoverflow.com/questions/816092

質問

私は不気味な活版印刷のアポストロフィ(’)–を扱うときに、奇妙な動作に遭遇しました。タイプライターのアポストロフィ( ')ではありません。ワイド文字列リテラルとともに使用すると、アポストロフィはwofstreamを中断します。

このコードは動作します

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

==&gt; A&#8217; B

このコードは動作します

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

==&gt; A&#8217; B

このコードは失敗します

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

==&gt; A

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

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

==&gt; A

何かアイデアはありますか?

役に立ちましたか?

解決

「有効にする」必要があります; 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();

&quot; A&#8217; B&quot; は実際にはutf-8文字列であり、utf-8を保存するため、このコードは機能します バイト単位のファイルへの文字列。

注: OSのようなPOSIXを使用しており、デフォルトのロケールが&quot; C&quot;と異なると仮定します。それがデフォルトのロケールです。

他のヒント

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top