2016-07-18 36 views
3

このトピックについて何十件もの質問を見ましたが、どれも私を助けませんでした。C++ファイルに英語以外のテキストを書き込む

は、私は、文字列 "հայեր" または "русский"(wchat_t*wstringLPTSTR、または何か他のもの)を持っていると仮定します。

出力ファイル "res.txt"を作成し、その文字列を書き留めたいとします。それを書こうとしているうちに、私は何も書いていませんでした。いくつかの任意の数字をファイルに追加します。

英語以外の文字列を保持する方法と、文字列をファイルに正しく書き込む方法を教えてもらえますか?

ありがとうございました。

+1

どのようにファイルを書きましたか? 'wchar_t *'や 'std :: wstring'を使っているなら、' std :: wofstream'を使うべきです。 – NathanOliver

+0

私は試みましたが、組み合わせの助けにはなりませんでした。だからあなたはwstringとしてそれを維持し、wofstreamを使用することをお勧めしますか?はいの場合、ファイルには何も書き込まれません – mbaros

+0

ソースファイルはどのようにエンコードされていますか? utf8、Latin-1、...? – Jarod42

答えて

0

これは私にとってはうまくいった。

#include <fstream> 
    #include <locale> 
    #include <codecvt> 

    const locale utf8_locale = locale(locale(), new codecvt_utf8<wchar_t>()); 
    wofstream file(url); 
    file.imbue(utf8_locale); 
    file << L"իմբյու" << endl; 
0

エンコードにはUnicodeを使用する必要があります。

+0

どのように?あなたは完全な例を持って来ることができますか? – mbaros

+0

"\ uXXXX"の形式でエスケープを使用する必要があります(Xsは10進数を表します)。このようにして、コード内にユニコード記号を使用できます。残念ながら、これらのシンボルにテキスト全体を入れることは、実際的ではありません。 C++は一般的にはユニコードの悪い使い方をしています...(つまり、あなたのプログラム全体がユニコードに基づいているなら、多分別の言語を使うことを提案しています) – Sia

+0

うわー...それはかなり強い声明です。私はC++を頻繁に使用していますが、ユニコードには問題はありません。しかし、それはあなたがそれをどのように使うか、そして何が必要なのかにまでこだわります。私がLinuxの世界に住んでいるので、文字列/テキストの大半はUTF-8でエンコードされています。これはC++でうまく動作します。Windowsでは、C++ソースでは少し難解なUTF-16に向かうことにしました(ただし、良い文字列リテラルを「ワイド」にするには良いIDEとメモリが必要です)。しかし、IMOはまったく問題なく動作します"悪い使い方"。あなたがうまく計画していて、あなたが何をしているのかが分かっているなら、明示的に\ uXXXXで作業する必要はありません。 – Ped7g

2

ラテン文字以外の文字を含むテキストファイルを作成する作業を開始する前に、ロケールに使用するエンコードを決定する必要があります。

たとえば、ロケールがUTF-8エンコーディングを使用する場合、ロケールがKOI8-Rの場合とはまったく異なるエンコーディングが文字列 "русский"に施されます。

UTF-8の文字列 "русский"は、八重奏(バイト)で表されます。d1 80 d1 83 d1 81 d1 81 d0 ba d0 b8 d0 b9KOI8-Rロケールの場合、同等のオクテットはd2 d5 d3 d3 cb c9 caです。

国際化は困難です。

ほとんどのケースでは、C++ライブラリのワイド文字を使用することができるかもしれませんがユニコードでストリーム:

#include <iostream> 
#include <locale> 

int main() 
{ 
    std::locale::global(std::locale("")); 
    std::wcout << L"\u0440\u0443\u0441\u0441\u043a\u0438\u0439" << std::endl; 
    return 0; 
} 

うまくいけば、これからの出力は「русский」になり、ご使用のプラットフォーム上で。これが機能すれば、これは最も抵抗の少ない経路かもしれませんが、各文字のユニコード値を調べなければなりません。

新しいC++標準ではUTF-8がサポートされていますが、ここでの答えは、ロケール、ユニコード、国際化の一般的な概念について勉強してください。これらのこと全てがどのように機能するかを完全に理解していなければ、これを行うのは難しいでしょう。

+0

コンソールやteファイルに何も出力しません。 – mbaros

+0

次に、C++コンパイラまたはオペレーティングシステムは、現在のC++標準の最小要件をサポートしていません。現在のロケールにはキリル文字が含まれていません。コンパイラとシステム環境のロケールを知らなくても、それ以上のことは決めることができません。 –

関連する問題