0
#ifndef UNICODE
#define UNICODE
#endif

#include <stdio.h>
int main()
{
    FILE* oFile;
    oFile = _wfopen(L"foo.txt",L"w");
    //*
    fwprintf(oFile,L"%s", L"ęłó☺☻♥♦•ń");
    fclose(oFile);
    return 0;
}

すべての関数が広いのに、なぜこのプログラムはUTF-16の代わりにASCIIファイルを作成するのですか?!

foo.txtコンテンツ:

za[疑問符]ó[2つの疑問符...]g[...4つ...]ja[別の2つ...][5つ*?][そして最後の1つ]

これは変換できません。

fwprintf(oFile,L"%c%c%s",0xFE,0xFF,L"zażółć gęśłą jaźń ☺☻♥♦• ć");

現在、リトルエンディアンまたはビッグエンディアンのバイト順マークが設定されているかどうかに関係なく、中国の記号が表示されます。

4

2 に答える 2

5

MSVCを使用していると仮定して、_wfopen(太字の鉱山)のドキュメントを引用するには:

fopen関数は、filenameで指定されたファイルを開きます。_wfopenは、fopenのワイド文字バージョンです。_wfopenの引数は、ワイド文字の文字列です。それ以外の場合、_wfopenとfopenは同じように動作します。_wfopenを使用するだけでは、ファイルストリームで使用されるコード化文字セットには影響しません。

ドキュメントをさらに読む:

fopenはUnicodeファイルストリームをサポートしています。Unicodeファイルを開くには、次のように、fopenする目的のエンコーディングを指定するccsフラグを渡します。

fopen(&fp、 "newfile.txt"、 "rw、ccs = encoding");

エンコードに使用できる値は、UNICODE、UTF-8、およびUTF-16LEです。

次のコードは、UTF-8でエンコードされたファイルを書き込みます。このソースファイルをUTF-16BE、UTF-16LE、およびUTF-8に保存しましたが、MSVCは正しくコンパイルおよび実行できました。

#include <stdio.h>

int main()
{
    FILE* oFile;
    oFile = fopen("foo.txt","w, ccs=UTF-8");
    fwprintf(oFile,L"%s", L"ęłó☺☻♥♦•ń");
    fclose(oFile);
    return 0;
}

この出力をWindowsコマンドラインに表示するには、UTF-8コードページに切り替える必要があることに注意してください。

C:\x>chcp
Active code page: 1252

C:\x>x

C:\x>type foo.txt
ęłó☺☻♥♦•ń
C:\Users\metolone\Desktop\x>chcp 65001
Active code page: 65001

C:\x>type foo.txt
ęłó☺☻♥♦•ń
于 2012-05-27T06:34:43.410 に答える
2

CまたはC++プログラムでの文字幅(charまたはwchar_t)の選択は、ファイルのエンコードとはまったく関係ありません。

たとえば、UTF16LEでエンコードされたファイルが必要な場合は、グローバルロケールとして、またはC++ストリームに組み込まれたUTF16LEを指定するロケールを使用する必要があります。または、文字をUTF16LEでエンコードされたバイトシーケンスに自分で変換し(iconvWindowsの類似物を使用して)、バイト指向の出力を使用してファイルに送信することもできます。

注意1:ワイド文字列には"%ls"フォーマットが必要です。

注意:文字列リテラルの非ASCII文字は移植できません。

注意:タグに「c」と<cstdio>表示されていますが、C ++ですが、プログラムは有効なC++プログラムではありません。どの言語を使用していますか?決心してください;)

于 2012-05-26T21:22:24.147 に答える