WindowsプラットフォームでUnicode(UTF-8)ファイルをwstring
に読み込むにはどうすればよいですか?Unicode UTF-8ファイルをwstringに読み込む
答えて
この質問はConfused about C++'s std::wstring, UTF-16, UTF-8 and displaying strings in a windows GUIで解決されました。まとめると、wstringはUTF-16の前身であるUCS-2標準に基づいています。これは厳密に2バイトの標準です。私はこれがアラビア語をカバーすると信じている。
私はあなたがUTF-16でwstringを使うことができると思います –
@Daivd:あなたは間違っています。これはよくある誤解です。 UTF-16は、0〜0x10FFFFまでの1,112,064コードポイントをカバーします。この方式では、1つまたは2つの16ビットワードの可変長記憶が必要ですが、UCS-2は厳密に1つの16ビットワードです。定義wchar_tをトレースバックすると、ルートとして16ビットの基本型(通常はshort)があることがわかります。 – ThomasMcLeod
@David:技術的には、 'wstring'はWindows上の単なる16ビット整数の配列です。 UCS-2またはUTF-16データなど、好きなものを格納できます。ほとんどのWindows APIは、今日はUTF-16文字列を受け入れます。 – Philipp
ここでは、Windowsのみのプラットフォーム固有の機能です:あなたはそれを使用したくない場合がありますので、ファイル全体が、メモリにロードされ
std::wstring mytext = LoadUtf8FileToString(L"C:\\MyUtf8File.txt");
注:そうのような
size_t GetSizeOfFile(const std::wstring& path)
{
struct _stat fileinfo;
_wstat(path.c_str(), &fileinfo);
return fileinfo.st_size;
}
std::wstring LoadUtf8FileToString(const std::wstring& filename)
{
std::wstring buffer; // stores file contents
FILE* f = _wfopen(filename.c_str(), L"rtS, ccs=UTF-8");
// Failed to open file
if (f == NULL)
{
// ...handle some error...
return buffer;
}
size_t filesize = GetSizeOfFile(filename);
// Read entire file contents in to memory
if (filesize > 0)
{
buffer.resize(filesize);
size_t wchars_read = fread(&(buffer.front()), sizeof(wchar_t), filesize, f);
buffer.resize(wchars_read);
buffer.shrink_to_fit();
}
fclose(f);
return buffer;
}
使用して非常に大きなファイルの場合
また、全体の方法を行くかもしれません:_wfopen(filename.c_str()、L "rt、ccs = UTF-8");変換は自動的になりました。 –
ありがとう、編集された答え。 – AshleysBrain
実際には、それをロールバックし、_wfopen上のドキュメントは自動的にワイド文字に変換し、このコードはそれを考慮に入れません。 – AshleysBrain
@Hans Passantのコメントによれば、最も簡単な方法は_wfopen_sです。モードrt, ccs=UTF-8
でファイルを開きます。ここで
は少なくともVC++ 2010で動作する別の純粋なC++のソリューションです:locale::empty()
を除き
#include <locale>
#include <codecvt>
#include <string>
#include <fstream>
#include <cstdlib>
int main() {
const std::locale empty_locale = std::locale::empty();
typedef std::codecvt_utf8<wchar_t> converter_type;
const converter_type* converter = new converter_type;
const std::locale utf8_locale = std::locale(empty_locale, converter);
std::wifstream stream(L"test.txt");
stream.imbue(utf8_locale);
std::wstring line;
std::getline(stream, line);
std::system("pause");
}
(ここでlocale::global()
が同様に働くかもしれない)とbasic_ifstream
コンストラクタのwchar_t*
過負荷、これでもかなりする必要があります標準に準拠しています(「標準」はC++ 0xを意味します)。 C++ 11のサポートにより
、あなたは両方、UTF-8のファイルを読み書きするために使用することができUTF-8でエンコードされたバイト文字列とUCS2またはUCS4文字列と間の変換をカプセル化したstd::codecvt_utf8 facetを使用することができますテキストとバイナリです。あなたは通常、総称して、特定のローカライズされた環境を定義するファセットのセットとしてカルチャ固有の情報をカプセル化しlocale objectを作成facet使用するためには
。あなたは、ロケールオブジェクトを持っていたら、あなたはそれをあなたのストリームバッファをimbueことができます。このように使用することができます
#include <sstream>
#include <fstream>
#include <codecvt>
std::wstring readFile(const char* filename)
{
std::wifstream wif(filename);
wif.imbue(std::locale(std::locale::empty(), new std::codecvt_utf8<wchar_t>));
std::wstringstream wss;
wss << wif.rdbuf();
return wss.str();
}
:
std::wstring wstr = readFile("a.txt");
あなたは、文字列ストリームを使用して作業する前に別の方法としては、the global C++ localeを設定できますは、std::locale
デフォルトコンストラクタへの今後のすべての呼び出しで、グローバルC++ロケールのコピーを返します(この場合、ストリームバッファを明示的に埋め込む必要はありません)。
std::locale::global(std::locale(std::locale::empty(), new std::codecvt_utf8<wchar_t>));
'new codecvt_utf8'に対応する' delete'が必要ですか? –
codecvt_utf8を明示的に削除する必要はありません。これは、codecvt_utf8のrefcounterがゼロになるとstd :: localeのデストラクタで行われます(http://en.cppreference.com/w/cpp/locale/locale/%7Elocale参照) – MrTux
これは少し生ではありませんが、ファイルを普通の古いバイトとして読み取ってから、バイトバッファをwchar_t *にキャストする方法はありますか?
ような何か: "ユニコード" と
#include <iostream>
#include <fstream>
std::wstring ReadFileIntoWstring(const std::wstring& filepath)
{
std::wstring wstr;
std::ifstream file (filepath.c_str(), std::ios::in|std::ios::binary|std::ios::ate);
size_t size = (size_t)file.tellg();
file.seekg (0, std::ios::beg);
char* buffer = new char [size];
file.read (buffer, size);
wstr = (wchar_t*)buffer;
file.close();
delete[] buffer;
return wstr;
}
#include <iostream>
#include <fstream>
#include <string>
#include <locale>
#include <cstdlib>
int main()
{
std::wifstream wif("filename.txt");
wif.imbue(std::locale("zh_CN.UTF-8"));
std::wcout.imbue(std::locale("zh_CN.UTF-8"));
std::wcout << wif.rdbuf();
}
- 1. Unicode UTF-32ファイルをwstringに読み込みます。
- 2. Unicodeファイルの読み込みUnicodeファイルの読み込み
- 3. wstringを使用して行を読み込むファイル
- 4. UTF8、Unicodeとバイナリのデータ読み込みの問題
- 5. UTF8からのファイルの読み込み
- 6. C++ファイル読み込みライブラリ - ANSIとUnicode
- 7. utf8文字でURLコンテンツを正しく読み込むには?
- 8. ファイルを読み込む(FORTRAN)
- 9. ファイルを読み込むpython
- 10. pickleファイルを読み込む
- 11. Unicodeファイルを読む - Python3.2
- 12. Pythonでファイルに書き込む、Arduinoでファイルを読み込む
- 13. InputStreamからUnicodeを正しく読み込むには?
- 14. Unicodeでエンコードされた文字をアプリケーションに読み込む
- 15. ストリームを含むファイルを読み込む
- 16. C#UTF8読み込み/出力
- 17. ファイルから読み込む
- 18. 読み込む設定ファイル
- 19. ファイルから読み込む
- 20. csvファイルをDataTableに読み込む
- 21. HTTPResponseをtarファイルに読み込む
- 22. ファイルを文字列に読み込む
- 23. 書き込み中にファイルを読む
- 24. Python:リストにtxtファイルを読み込む
- 25. ファイル名を配列に読み込む
- 26. TAdvMemoにファイルを読み込む
- 27. ファイルをMavenプロパティに読み込む
- 28. C:ファイルを配列に読み込む
- 29. ExcelファイルをSASデータセットに読み込む
- 30. CSVファイルを辞書に読み込む?
あなたはUTF-8またはUTF-16を意味していますか?そして、あなたはどんなプラットフォームを使っていますか? – dan04
utf-8 on windows – Abdelwahed
この記事を読む:[UTF-8をC++ストリームで読む](http://www.codeproject。 – Nawaz