0

UTF-8 でエンコードされた Unicode テキスト ファイルを読み取ってコンソールに出力していますが、表示される文字は、ファイルの作成に使用したテキスト エディターと同じではありません。これが私のコードです:

#define UNICODE

#include <windows.h>
#include <iostream>
#include <fstream>
#include <string>

#include "pugixml.hpp"

using std::ifstream;
using std::ios;
using std::string;
using std::wstring;

int main( int argc, char * argv[] )
{
    ifstream oFile;

    try
    {
        string sContent;

        oFile.open ( "../config-sample.xml", ios::in );

        if( oFile.is_open() )
        {
            wchar_t wsBuffer[128];

            while( oFile.good() )
            {
                oFile >> sContent;
                mbstowcs( wsBuffer, sContent.c_str(), sizeof( wsBuffer ) );
              //wprintf( wsBuffer );// Same result as wcout.
                wcout << wsBuffer;
            }

            Sleep(100000);
        }
        else
        {
            throw L"Failed to open file";
        }
    }
    catch( const wchar_t * pwsMsg )
    {
        ::MessageBox( NULL, pwsMsg, L"Error", MB_OK | MB_TOPMOST | MB_SETFOREGROUND );
    }

    if( oFile.is_open() )
    {
        oFile.close();
    }

    return 0;
}

エンコーディングについてわからないことがあるはずです。

4

4 に答える 4

2

ワイド文字列は UTF-8 を意味しません。実際、これはまったく逆です。UTF-8 は Unicode Transformation Format (8 ビット) を意味します。これは 8 ビット文字で Unicode を表現する方法なので、通常charの s. 通常の文字列 (ワイド文字列ではない) に読み込む必要があります。

ワイド文字列はwchar_t、Windows では 16 ビットを使用します。OS は、その「ワイド」機能に UTF-16 を使用します。

Windows では、UTF-8 文字列は を使用して UTF-16 に変換できますMultiByteToWideChar

于 2013-09-07T22:03:44.530 に答える
2

問題は、ambstowcsが実際には UTF-8 を使用していないことです。UTF-8と互換性のない古いスタイルの「マルチバイトコードポイント」を使用しています(技術的にはUTF-8コードページを定義することは可能ですが[私は信じています]が、Windowsにはそのようなものはありません)。

UTF-8 を UTF-16 に変換したい場合はMultiByteToWideChar、 とcodepageofを使用できますCP_UTF8

于 2013-09-07T22:12:36.843 に答える
0

char_t最大 6 個の 8 ビット char_t を保持するC++ コンテナーを作成し、 std::vector. との間で変換するか、wchar_tまたは に追加しstd::stringます。

ここで確認してください: Github で UTF-8_String 構造を表示する

#include "UTF-8_String.h" //header from github link above

iBS::u8str  raw_v;
iBS::readu8file("TestUTF-8File.txt",raw_v);
std::cout<<raw_v.str()<<std::endl;

上記のヘッダーの u8char 構造体で wchar_t を uint32_t に変換する関数を次に示します。

    #include <cwchar>

    u8char& operator=(wchar_t& wc)
    {
        char temp[6];
        std::mbstate_t state ;
        int ret = std::wcrtomb((&temp[0]), wc, &state);
        ref.resize(ret);
        for (short i=0; i<ret; ++i) 
            ref[i]=temp[i];
        return *this;
    };
于 2016-05-17T16:44:23.263 に答える