1

VS 2012 を使用してこのコードを作成しました。

std::wofstream logout("my_log.txt", std::ios_base::out | std::ios_base::trunc);
std::locale utf8_locale(locale(), new codecvt_utf8<wchar_t>);
logout.imbue(utf8_locale);

if (!logout.is_open()) 
{
 printf("Cannot open file.\n"); 
 return 1; 
}
else printf("Log file created.\n");

logout << "Client IP            │"<< "Recv time                │"<< "Request               │"<< "Response     "<<endl;
logout << "─────────────────────┼"<< "─────────────────────────┼"<<endl;

my_log.txt ファイルでは、すべての Unicode 記号が「?????」に置き換えられます。ログファイルテーブルのようなものを作成したい。「---」のような標準のASCII記号を使用すると、機能し、それらはすべて正しく表示されます。グローバル ロケールを変更しようとしましたが、成功しません。

4

2 に答える 2

0

ああ、これは実際にとても面白いです。

wchar_t *s1 = L"\u2502"; // "│"
wchar_t *s2 = L"\u2500"; // "─"
wchar_t *s3 = L"\u253C"; // "┼"
logout << s1<<s2<<s3<<endl;

.txt ファイルに Unicode 番号が表示されるようになりました。\uXXXXしかし、( )なしで同じ構造体を使用できます

logout << L" │ ─ ┼"<<endl;

これも機能します。

于 2015-09-12T16:33:11.377 に答える
0

これが、文字列リテラルで ASCII 以外を使用しない理由です。

あなたのコードは問題ありませんが、文字列リテラルには、あなたが思っていることが含まれていません。これはおそらく、テキスト エディターの構成が不適切であるか、機能が不十分であることが原因です。

代わりに ( \uXXXX) エスケープ シーケンスを使用して、何が得られるかを理解してください。2015 年には、ASCII 文字から形成されたソース コードに間違いはありません。

于 2015-09-12T15:33:31.200 に答える