Delphi/C++ Builder TBytesからString, StringからTBytes

UTF8で記述されたファイルを TFileStream 等で Byte配列に取り出したまではよいが、そのデータを 2009以降 の String型へ変換する所で躓く

SetLength と CopyMemory の組み合わせや PChar 等でバイト配列のポインタをキャストしても上手くいかない(SJIS のファイルで、AnsiString の場合は、単純な配列なので、上記方法でも可能だったりする)
また、SysUtils.StringOf を利用すると、デフォルトエンコードで変換されてしまう

UTF8 のまま(Stream等から読み込んだ) Byte配列を String型へ変換するには
var ByteArray: TBytes;
begin
    // :
    SetLength(ByteArray, Stream.Size);
    Stream.ReadBuffer(ByteArray, Stream.Size);
    S := TEncoding.UTF8.GetString(ByteArray);
end;
※UTF8で記述されたテキストファイルは、BOMが入っている可能性もあるので、そちらも注意が必要

逆に 2009以降の String型を UTF8 のままファイル等へ書き込むには
var ByteArray: TBytes;
begin
    ByteArray := TEncoding.UTF8.GetBytes(S);
    Stream.WriteBuffer(ByteArray, Length(ByteArray));
end;
という形で、バイト配列へ変換してから書き込む

コメント