Delphi/C++ Builder TBytesからString, StringからTBytes
UTF8で記述されたファイルを TFileStream 等で Byte配列に取り出したまではよいが、そのデータを 2009以降 の String型へ変換する所で躓く
SetLength と CopyMemory の組み合わせや PChar 等でバイト配列のポインタをキャストしても上手くいかない(SJIS のファイルで、AnsiString の場合は、単純な配列なので、上記方法でも可能だったりする)
また、SysUtils.StringOf を利用すると、デフォルトエンコードで変換されてしまう
UTF8 のまま(Stream等から読み込んだ) Byte配列を String型へ変換するには
逆に 2009以降の String型を UTF8 のままファイル等へ書き込むには
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;という形で、バイト配列へ変換してから書き込む
コメント