【问题标题】:Get string byte length in delphi在delphi中获取字符串字节长度
【发布时间】:2015-03-31 08:53:12
【问题描述】:

我想查找字符串字节长度。首先转换为字节然后得到长度那么我怎样才能得到字符串字节长度?

var
  val : String;
begin
  val:= 'example';
  ShowMessage(IntToStr(Length(val) * ???)); -> BYTE LENGTH
end;

【问题讨论】:

  • 如果你有足够的 Delphi 最新版本,也可以直接使用 ByteLength
  • 我正在使用 xe6,再次感谢 :)

标签: delphi


【解决方案1】:

你可以使用SysUtils.ByteLength()函数:

uses
  SysUtils;

var
  val : String;
begin
  val:= 'example';
  ShowMessage(IntToStr(ByteLength(val)));
end;

只知道ByteLength() 只接受UnicodeString 作为输入,所以任何传递给它的字符串,无论是(Ansi|Wide|UTF8|RawByte|Unicode)String,都将被转换为UTF-16(如果还没有的话)然后返回UTF-16 中的字节数,简单来说就是Length(val) * SizeOf(WideChar)

如果您想在另一个字符集中获得 UnicodeString 的字节长度,您可以使用 SysUtils.TEncoding 类:

var
  val : String;
begin
  val := 'example';
  ShowMessage(IntToStr(TEncoding.UTF8.GetByteCount(val)));
end;

var
  val : String;
  enc : TEncoding;
begin
  val := 'example';
  enc := TEncoding.GetEncoding(...); // codepage number or charset name
  try
    ShowMessage(IntToStr(enc.GetByteCount(val)));
  finally
    enc.Free;
  end;
end;

或者,您可以使用AnsiString(N) 类型将UnicodeString 转换为特定的代码页,然后使用Length() 获取其字节长度,而不管N 实际上是什么:

type
  Latin1String = type AnsiString(28591); // can be any codepage supported by the OS...
var
  val : String;
  val2: Latin1String;
begin
  val := 'example';
  val2 := Latin1String(val);
  ShowMessage(IntToStr(Length(val2)));
end;

【讨论】:

    【解决方案2】:
    var
      val : String;
    begin
      val:= 'example';
      ShowMessage(IntToStr(Length(val) * SizeOf(Char)));
    end;
    

    或使用ByteLength 来获取字符串的大小(以字节为单位)。 ByteLength 通过将该字符串中的字符数乘以字符的大小来计算字符串的大小。

    【讨论】:

    • ByteLength 接受一个 UTF-16 字符串,如果你将它传递给 ANSI 或 MBCS 字符串,那么时髦的东西也是如此。
    • @DavidHeffernan:请进一步解释一下。
    • @KromStern:我敢打赌:如果你传递的不是 UTF-16 字符串,你首先会看到转换为 UnicodeString,然后得到它的字节长度,而不是 AnsiString,或者UTF8String,或者你传递的任何东西。
    • ByteLength() 仅接受 UnicodeString 作为输入,因此传递给它的任何内容都将转换为 UTF-16(如果尚未),然后它将返回 UTF-16 中的字节数(如Length(val) * SizeOf(WideChar))。如果您想在另一个字符集中使用UnicodeString 的字节长度,请使用TEncoding.GetEncoding(CodepageOrCharsetHere)TEncoding.GetByteCount(UnicodeString)。或者使用AnsiString(N) 类型将val 转换为特定的代码页,然后使用Length(RawByteString) 获取其字节长度,而不管N 是什么。
    • @RemyLebeau:请发表答案!
    猜你喜欢
    • 2013-05-07
    • 2017-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多