活版印刷のアポストロフィ+ワイド文字列リテラルがwofstreamを壊しました(C ++)
-
03-07-2019 - |
質問
私は不気味な活版印刷のアポストロフィ(’)–を扱うときに、奇妙な動作に遭遇しました。タイプライターのアポストロフィ( ')ではありません。ワイド文字列リテラルとともに使用すると、アポストロフィは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の場合)の値はおそらく見つかりません。