14

4我必须将字符串写入二进制 MIDI 文件。该标准要求知道字符串的长度(以字节为单位)。由于我也想为移动设备编写代码,所以我不能使用 AnsiString,这是确保字符串是单字节字符串的好方法。这简化了事情。我测试了以下代码:

TByte = array of Byte;

function TForm3.convertSB (arg: string): TByte;
var
   i: Int32;
begin
   Label1.Text := (SizeOf (Char));
   for i := Low (arg) to High (arg) do
   begin
      label1.Text := label1.Text + ' ' + IntToStr (Ord (arg [i]));
   end;
end; // convert SB //

convertSB ('MThd');

它在 Windows 和 Android 中返回 2 77 84 104 100(作为标签文本)。这是否意味着 Delphi 默认将字符串视为 UTF-8?这将大大简化事情,但我在帮助中找不到它。将其转换为字节数组的最佳方法是什么?读取每个字符并测试它是 1、2 还是 4 字节并在数组中分配这个空间?要转换回字符:只需读取字节数组,直到遇到 < 128 的字节?

4

1 回答 1

49

Delphi 字符串在内部编码为 UTF-16。2有一个很大的线索SizeOf(Char)

所有字符在 ASCII 范围内都有序号的原因是 UTF-16 扩展了 ASCII,因为 ASCII 范围内的字符 0 到 127 在 UTF-16 中具有相同的序号值。你所有的字符都是ASCII字符。

也就是说,您无需担心内部存储。TEncoding您只需使用该类在字符串和字节数组之间进行转换。例如,要转换为 UTF-8,您可以编写:

bytes := TEncoding.UTF8.GetBytes(str);

而在相反的方向:

str := TEncoding.UTF8.GetString(bytes);

文档中所述,该类支持许多其他编码。从您需要使用哪种编码的问题中不清楚。希望你能从这里解决剩下的问题。

于 2014-01-29T21:16:35.783 回答