【问题标题】:delphi 2009 cast to string length 2delphi 2009强制转换为字符串长度2
【发布时间】:2011-03-15 12:22:47
【问题描述】:

寻找如何抑制来自编译器的警告说可能的数据丢失,

st:= copy(str,0,2);

其中 st 是 string[2] 并且 str 有超过 2 个字符。

并且复制被定义为 from str 返回一个新字符串,该字符串是 0 , 2 个位置的子集。

【问题讨论】:

    标签: string delphi casting delphi-2009


    【解决方案1】:

    这将抑制警告,但请注意潜在问题仍然存在:从 Unicode 转换为 AnsiString 可能会导致数据丢失。

    st := ShortString(Copy(str,1,2));
    

    别忘了 Delphi 的字符串是从 1 开始的,字符串中的第一个字符是 1,而不是 0。

    【讨论】:

    • +1。如果编译器警告您有关 implicit 转换,则通过使转换 explicit 告诉编译器这是故意的。
    • string[2] 由 ansichars 组成。它是一种短字符串类型。我想知道 OP 是否知道这一点。
    • @none:你的意思可能正好相反:stringstring[2]。在 Delphi 2009 中,标准 string 是 Unicode(感谢上帝!),但 string[2] 是所谓的 ShortString,它不是 Unicode,每个字符只有一个字节。所以st 不能保存例如字符串∰∂,即使它只包含两个字符。
    【解决方案2】:

    如果你只是写:

    st := shortstring(str);
    

    编译器将为您完成工作。

    它将剪切str 的内容以适应st 的最大长度。所以如果st 被定义为st: string[2]; if 将只检索str 的前两个字符。

    但你可能会在 str 中丢失非 ascii 编码的字符(如果它只包含英文文本,这不是问题)。

    【讨论】:

    • @Andreas 对不起,你错了。如果他系统的当前代码页不是 WinAnsi(即 1252)而是例如亚洲 MBCS 代码页,如果源 str 包含拉丁重音符号,他也可能丢失 Ansi 字符,例如:只有 7 位 ASCII 和 unicode 字符由当前代码页将按预期转换为短字符串内容。
    【解决方案3】:

    你用错了你必须做的:

    st:= copy(str,1,2);
    

    【讨论】:

    • 这里仍然会有来自 Delphi 2009+ 编译器的警告,关于隐式字符串类型转换。它至少需要一个明确的。
    • 哦...好吧我看不到它,因为我有 D7
    猜你喜欢
    • 2010-09-21
    • 2023-04-06
    • 2011-01-01
    • 2016-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多