C++Builder は、ファイルの読み込みがとても簡単で、TStringList::LoadFromFile() により、文字コードを適切に処理して読み込んでくれる。
LoadFromFile() は見ただけで使い方が分かる。しかし、その親戚である、メモリからの読み込みを行う LoadFromStream() については、まとまった説明が見当たらなかったので試行錯誤。
で、以下が結果のコード。メモリに格納されている文字列を、文字コードを指定して TStringList に読み込む。
UTF8_STR が文字列が格納されているメモリ領域。今回は定数にしてあるが、通常は、どこかから持ってきた内容を格納しているバッファになる。
TStringList::LoadFromStream() は、TStream 型(の派生クラス)からしかデータを読み出せない。メモリ領域をそのまま読むことはできないので、仲介役の TMemoryStream が必要になる。
TMemoryStream にメモリ領域の内容を書き込んでいるのが
Write() 後に、読み書き位置を先頭に戻しておく。
あとは、LoadFromStream() に TMemoryStream へのポインタを渡せば、文字列が読み込まれる。
文字コードの指定は、
以上、コードを実行すると、メモリ領域から 3 バイトを読み取って、「春」を取得できる。
LoadFromFile() は見ただけで使い方が分かる。しかし、その親戚である、メモリからの読み込みを行う LoadFromStream() については、まとまった説明が見当たらなかったので試行錯誤。
で、以下が結果のコード。メモリに格納されている文字列を、文字コードを指定して TStringList に読み込む。
void __fastcall TForm1::Button1Click(TObject *Sender)
{
const char UTF8_STR[] = { 0xE6, 0x98, 0xA5 };
unique_ptr<TMemoryStream> aMemStream(new TMemoryStream());
unique_ptr<TStringList> aStrList(new TStringList());
aMemStream->Write(UTF8_STR, 3);
aMemStream->Seek(static_cast<long>(0), soBeginning);
aStrList->LoadFromStream(aMemStream.get(), TEncoding::UTF8);
ShowMessage(aStrList->Text);
}
UTF8_STR が文字列が格納されているメモリ領域。今回は定数にしてあるが、通常は、どこかから持ってきた内容を格納しているバッファになる。
TStringList::LoadFromStream() は、TStream 型(の派生クラス)からしかデータを読み出せない。メモリ領域をそのまま読むことはできないので、仲介役の TMemoryStream が必要になる。
TMemoryStream にメモリ領域の内容を書き込んでいるのが
aMemStream->Write(UTF8_STR, 3);
TMemoryStream にメモリ領域の内容を読み込むというイメージだったので、最初 Read() を使いそうになってしまったが、Write() なので注意。Write() 後に、読み書き位置を先頭に戻しておく。
あとは、LoadFromStream() に TMemoryStream へのポインタを渡せば、文字列が読み込まれる。
文字コードの指定は、
- UTF-8……TEncoding::UTF8
- UNICODE(UTF-16)……TEncoding::Unicode
- 指定無し……自動判別
以上、コードを実行すると、メモリ領域から 3 バイトを読み取って、「春」を取得できる。