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

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

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

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

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

コメント