私はファイルを持っていて、行末はウィンドウのスタイルです。\r\n
; USC-2リトルエンディアンでエンコードされています。USC-2リトルエンディアンをUTF-8に正しく変換する方法は?
(USC-2リトルエンディアン)これはfruit.txt
私のファイルであると言う:
だから私はstd::wifstream
で開き、内容を解析してみてください:
// open the file
std::wifstream file("fruit.txt");
if(! file.is_open()) throw std::runtime_error(std::strerror(errno));
// create container for the lines
std::forward_list<std::string> lines;
// Add each line to the container
std::wstring line;
while(std::getline(file,line)) lines.emplace_front(wstring_to_string(line));
た場合、私は試しに試してみてください...
// Printing to cout
for(auto it = lines.cbegin(); it != lines.cend(); ++it)
std::cout << *it << std::endl;
...これは出力です:
Cherry
Banana
ÿþApple
さらに悪いことに、私はメモ帳++で開く場合は、まだ、これはそれが
ように私は、ソートのことで、これを是正することができますに見えるものです強制的に戻す符号変換USC-2本になる:
マイwstring_to_string
機能を
std::string wstring_to_string(const std::wstring& wstr) {
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> convert;
return convert.to_bytes(wstr);
}
ここでは何が起こっているのですか?どのようにして通常のUTF-8文字列を取得できますか?私もこの方法を試しました:How to read utf-16 file into utf-8 std::string line by line、しかしstd::wifstream
の最初の結果は全く出力がありません。誰かがUSC-2 LEデータを読みやすいUTF-8データに変換する最善の方法で私に指示してくれますか?
編集 MSYS2が提供するmingw64/mingw-w64-x86_64-gcc 6.3.0-2のバグがあると思います。私はみんなの提案を試して、ストリームにロケールを埋め込むだけでは出力が全くないだけです。私は "C"と "POSIX"という2つのネイティブロケールしか用意されていないことを知っています。私はVisual Studioを試しましたが、4GBのダウンロードには十分なインターネット速度がありません。 @Andrei R.のようなICUを使用しましたが、それは素晴らしいです。
私は標準ライブラリを使うのが好きでしたが、これで大丈夫です。このソリューションが必要な場合は、私のコードを見てください:https://pastebin.com/qudy7yva
このWindowsですか?コンソールテキストをエディタにコピーしてNP ++の画像を取得しましたか? (そして、誰かがNP ++がWindowsプログラムであると発言する前に、Wine上でうまく動作します) – deviantfan
はい、これはWindowsです。 ./program.exe> log.txtのように私のプログラムを実行してlog.txtを取得しました。私はMSYS2のg ++ 6.3.0を使用しています –
Windowsコンソール(すべてのバージョンのWindows用)ではUTF8を処理できないことがわかります。いくつかの事柄は回避策がありますが、100%の正しい動作は不可能です(例えば、CRTバグのために修正するつもりがない(作業が多すぎるためなど))。 >リダイレクトはあなた自身のプログラムの一部ではないので、あまりにもそれに頼ることはありません。 – deviantfan