2009-05-03 10 views
1

タイプライターのアポストロフィ( ')ではなく、不吉な字体アポストロフィ(')を扱うときにちょっと変わった動作が発生しました。ワイド文字列リテラルで使用すると、アポストロフィはwofstreamを破ります。タイポグラフィアポストロフィ+ワイド文字列リテラルが私のwofstreamを壊しました(C++)

このコードは、このコードが動作するA'B

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

==>

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

==> A'B

は、このコードは

を失敗した作品
wofstream file("test.txt"); 
file << L"A’B" ; 
file.close(); 

==>

このコードは失敗した...

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

==>

任意のアイデア?

+0

どのように失敗していますか?例外? – Skurmedel

+0

文字列が切り詰められています。 –

答えて

1

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

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

あなたは、システムのロケールen_US.UTF-8を持っている場合は、システムロケールen_US.ISO8859-1を持っているのであれば、ファイルtest.txtは、 UTF8エンコードされたデータ(4不戦勝)が含まれます、 ISO 8859-1がそのような文字を逃していない限り、8ビットのエンコーディング(3バイト)としてエンコードします。 "A’B"が実際にUTF-8文字列であり、あなたがバイト単位でファイルにUTF-8 文字列を保存するため

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

このコードは動作します。

注:私はあなたがOSのようなPOSIXを使用していると仮定し、あなたはデフォルトのロケールである "C"とは異なるデフォルトのロケールを持っています。

+0

std :: locale :: global(std :: locale( "french"));働く 私は今理解していると思います。 通常、Unicode文字を扱う場合(あまりにも曖昧です...私が知っている)、 'L'がないと、コンパイラ(VS)は "universal-character-name ...で表される文字を現在のコードページで表現できません"今回は私はこの警告が表示されないことに驚いていたので、何かが間違っていると思いました。 また、私は、UTF-8が128 US-ASCIIに対して1バイトのエンコーディングしか使用していないと思います。 –

+0

1位:UTF-8はUS-ASCIIと互換性があります。私は実際にVSがどのようにUnicode Charrectersを表すのか分からず、gccはデフォルトでutf-8を使用し、VSはローカルcharsetを使用することがあります。しかし、一般的な考え方では、ロケールを8ビットのcharrectersをエンコードするロケールに変換するロケールを設定する必要があります。 unixでは、これは通常utf8です – Artyom

0

"壊れている"ソースファイルのUnicode文字をコンパイラがサポートしていませんか? \xなどを使用して文字列リテラルの文字をエンコードするとどうなりますか?あなたのソースファイルは、あなたのコンパイラのためにwchar_tにエンコードされているかもしれません。

+0

私が困惑しているのは、unicode(http://mariusbancila.ro/blog/?p=135)wofstreamと 'が正しく動作するときです。しかし、なぜユニコードなしのストリームも機能しますか? –

+0

"unicode"があまりにも曖昧です。たとえば、 ofstreamのUTF-8はまだUnicodeですが、あなたはwchar_tsを使用しません。これは、ソースファイルのエンコーディングと、実際に文字列リテラルに入れていることと、ソースファイルがエンコーディングされることをコンパイラーが期待する/考えていることとの間の相互作用である可能性が最も高いです。ブログの投稿はWindows APIを使用していますが、VC++を使用しているWindowsでですか? –

0

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

私はここで何が起こっているのか分かりませんが、とにかく推測を嫌うでしょう。印刷アポストロフィはおそらく1バイトに収まる値を持っています。これは"A’B"で動作します。なぜなら、基本的なエンコーディングを気にせずに、盲目的にバイトをコピーするからです。しかし、L"A’B"では、インプリメンテーションに依存するエンコーディング係数が有効になります。この特定の文字を格納するための適切なUTF-16(Windowsの場合)またはUTF-32(* nix/Macの場合)の値は、おそらく見つかりません。

関連する問題