You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

64位Android下TUniQuery将TimeToStr空格替换为问号问题求助

解决64位安卓下TUniQuery赋值时空格被替换为问号的问题
  • 确认空格字符类型
    先排查TimeToStr返回的空格是否为普通ASCII空格(ASCII 32),在赋值前添加代码验证:

    var SpaceCharCode: Integer;
    SpaceCharCode := Ord(Text[Pos('AM', Text) - 2]); // 定位到AM前的空格
    ShowMessage(IntToStr(SpaceCharCode));
    

    如果返回值不是32,说明是**非断空格(U+00A0)**这类特殊空格字符,这类字符在部分编码转换场景中会被替换为问号。

  • 替换非标准空格为普通空格
    若确认是特殊空格,直接全局替换为普通ASCII空格:

    Text := StringReplace(Text, #$00A0, ' ', [rfReplaceAll]);
    // 也可以同时处理其他可能的特殊空格
    Text := StringReplace(Text, #$2000, ' ', [rfReplaceAll]);
    Text := StringReplace(Text, #$2001, ' ', [rfReplaceAll]);
    
  • 手动格式化时间,避免依赖系统区域设置
    TimeToStr的输出受系统区域设置影响,64位安卓下的区域配置可能返回含特殊空格的字符串。改用FormatDateTime精准控制输出格式:

    var
      DateVal: TDate;
      TimeVal: TTime;
      Text: string;
    begin
      DateVal := Now;
      TimeVal := Now;
      Text := Trim(DateToStr(DateVal)) + '|' + Trim(FormatDateTime('hh:mm:ss tt', TimeVal));
      // 替换特殊空格
      Text := StringReplace(Text, #$00A0, ' ', [rfReplaceAll]);
      UniQuery1.FieldByName('BATCH DATA').AsString := Text;
    end;
    
  • 检查UniDAC连接与字段配置

    • 确认SQLite连接的CharacterSet属性设置为utf8,确保编码匹配;
    • 检查UseUnicode属性是否开启(默认应该开启,但64位安卓下可能存在默认值差异);
    • 确认数据库中BATCH DATA字段类型为TEXT,而非CHAR/VARCHAR(后者可能存在编码截断或转换问题)。
  • 强制编码转换验证
    由于Delphi 11的string是UTF-16编码,SQLite使用UTF-8,可手动强制转换编码后赋值:

    var Utf8Bytes: TBytes;
    Utf8Bytes := TEncoding.UTF8.GetBytes(Text);
    UniQuery1.FieldByName('BATCH DATA').AsString := TEncoding.UTF8.GetString(Utf8Bytes);
    

内容的提问来源于stack exchange,提问作者dallin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 21:18:25