2016-12-14 14 views
0

私はXMLを(UTF-8で)持っています。私はPugiXMLライブラリを使用して、変数std::stringの値を読み取る必要があります。値を読み取った後、私はそれをコンソールに印刷していますが、私の実際のプロジェクトでは、その値をPDF(LibHaruライブラリを使用)に入れなければなりません。マイMWEは以下の通りです:XMLからドイツ語のテキストを読んでPDFに書き込む

#include <iostream> 
#include "pugiconfig.hpp" 
#include "pugixml.hpp" 

using namespace pugi; 

int main() 
{ 
    pugi::xml_document doc; 
    pugi::xml_parse_result result = doc.load_file(FILEPATH); 

    xml_node root_node = doc.child("Report"); 
    xml_node SystemName_node = root_node.child("SystemName"); 

    std::string strSystemName = SystemName_node.child_value(); 

    std::cout<<" The name of the system is: "<<strSystemName<<std::endl; 

    return 0; 
} 

私はPugixmlライブラリを使用してXMLファイルから変数std::string strSystemNameの値を読んでいます。変数を読み取った後、画面上に印刷しています(私の実際のプロジェクトでは、pdfファイルに書き出しています)。 問題:デバッグ中に、変わった文字がXMLファイル(すでにUTF-8になっています)から読み込まれました。これは、変数を画面に表示するか、pdfに配置すると表示されます。

重要:コンソールへの印刷はあまり重要ではありません。重要なのは、UTF-8エンコーディングも使用しているPDFファイルに正しく配置することです。しかし、私はstd::stringに変数を格納することはどうにかして問題を引き起こすと考えているので、wrone値はPDFライターに渡されます。

PS: VS2010これはC++ 11が使用されていません。

+0

マクロ 'PUGIXML_WCHAR_MODE'を変更すると... PugiXMLライブラリを再度ビルドする必要がありますか? – skm

+0

そうです。しかし、私は今それが役に立たないかもしれないと考えている。問題は、 'std :: string'を使うのではなく、' std :: cout'の 'operator <<'を直接使うことです。 'SystemName_node.print(std :: cout);だけを使うとどうなりますか? – StoryTeller

+0

もし私がそれを使用していれば、私はまだ 'を取得します。├älpha' – skm

答えて

1

ここでの問題は、std::coutが、文字列のUTF-8バイトをコンソールに反映していることです。通常、Windowsでは、コンソールはUTF-8ではなく、(例えば)コードページ1252で実行されているので、UTF-8の2バイトは2文字で表示されます。

解決策は、コンソールをUTF-8(this回答を参照)に変換するか、UTF-8文字列をCP-1252文字列に変換することです。私はこれがあなたの実際問題(pugixmlにUTF-8文字列を渡す)をデバッグするにはMultiByteToWideChar(UTF-8を指定)+ WideCharToMultiByte(CP-1252を指定)

を必要とするように起こっている、あなたが実際に見てする必要があると思います文字列のバイト数を確認し、それがあなたの考えであることを確認します。

+0

画面上の印刷が重要ではないと述べたところの「重要」セクションをお読みください。重要なことは、値を 'std :: string'に正しく格納して、PDFライターに正しく渡せるようにすることです。 – skm

+0

したがって、UTF8エンコーディング(例えば '" \ 0xC3 \ 0xA4 ")の文字列を作成し、それをPDF作成機能に渡し、どの出力を得るかを示す別の* [mvce]を構築する必要があります欲しいです')。それでも問題が解決しない場合は、PDF関数のドキュメントを見て、それらを機能させることができるかどうかを確認する必要があります。そうでない場合は、*その*例をさらに別の質問に投稿することができます。 –

関連する問題