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