问题标签 [ansistring]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
string - Delphi 中的 ReadStr() 和 WriteStr()
我有一些使用 ReadStr 和 WriteStr 的代码,我认为是将字符串写入二进制文件。
文档中对 WriteStr 的解释指出,它将以 AnsiString 的形式将原始数据写入对象的流,这是有道理的。但随后 ReadStr 说它读取了一个字符。那么它们不是彼此对立的吗?
假设我有,
我在上面使用了 WriteStr,它实际上写了什么?由于 WriteStr 需要 AnsiString,它是否将 pName 转换为这样?在这种情况下,它是否不会将“长度”字段写入流中,因为 AnsiString 指针指向第一个元素而不是长度字段?我也在寻找,这些天似乎 String == AnsiString,但我关于长度字段的问题仍然保持不变。
如果假设它没有将 Length 字段写入文件,它是否仍然在数据末尾写入 NULL?因此,我可以通过查找“\0”来找到字符串的结尾吗?ReadStr 是否读取到 NULL 字符?
非常感谢你 :)
memory-management - bds 2006 C 隐藏内存管理器冲突(类 new / delete[] vs. AnsiString)
我使用BDS 2006 Turbo C++已经很长时间了,我的一些大型项目(CAD/CAM、3D gfx 引擎和天文计算)偶尔会抛出异常(例如,在 3-12 个月的 24/7 重型使用中) )。经过大量调试后,我发现:
此代码通常在模板中,其中_s
也可以是类,因此delete[]
此代码应该可以正常工作,但delete[]
对于结构不能正常工作(类看起来不错)。没有抛出异常,内存被释放,但它以某种方式损坏了内存管理器分配表,在此之后任何新的分配都可能是错误的(新的可以创建与已分配空间甚至未分配空间的重叠分配,因此偶尔会出现异常)
我发现如果我添加空析构函数_s
比突然看起来一切正常
那么现在是奇怪的部分。在我将其更新到我的项目后,我发现AnsiString
该类的重新分配也很糟糕。例如:
在此代码dat
中包含一些有用的数据,然后是txt
通过添加行创建的一些字符串,因此txt
必须重新分配几次,有时dat
数据会被覆盖txt
(即使它们没有重叠,我AnsiString
认为重新分配所需的 temptxt
与重叠dat
)
所以我的问题是:
- 我在 code1, code2 中做错了吗?
有什么办法可以避免
AnsiString
(重新)分配错误?(但仍在使用它)- 经过大量调试(在发布问题 2 之后)我发现
AnsiString
不会导致问题。它们仅在使用它们时出现。真正的问题可能在于OpenGL客户端之间的切换。我有带有矢量图形预览的打开/保存对话框。如果我禁用这些VCL子窗口的OpenGL使用,那么内存管理错误就会完全消失。我不支持是什么问题(MFC/VCL之间不兼容AnsiString
窗口之间的不兼容,或者更可能是我在切换上下文时犯了一些错误,将进一步调查)。关注的OpenGL窗口是: - 主VCL窗体 + OpenGL
Canvas
客户区内的 - 主MFC打开/保存对话框的子级 + 停靠预览VCL表单 +客户端区域内的OpenGL
Canvas
- 经过大量调试(在发布问题 2 之后)我发现
附言
- 这些错误取决于数量
new/delete/delete[]
不是分配的大小 - code1 和 code2 错误都是重复的(例如,有一个解析器来加载复杂的 ini 文件,如果 ini 没有更改,则错误发生在同一行)
- 我仅在大型项目(纯源代码> 1MB)上检测到这些错误,并结合使用
AnsiString
和模板与内部动态分配,但它们也可能出现在更简单的项目中,但很少发生以至于我错过了它。 - 受感染的项目规格:
- win32 noinstall 独立(使用Win7sp1 x64但在XPsp3 x32上的行为相同)
- 如果使用GDI或OpenGL/GLSL
- 不计量是否使用设备驱动程序DLL
- 没有OCX或非标准VCL组件
- 没有DirectX
- 1 字节对齐的编译/链接
- 不要使用RTL、包或框架(独立)
抱歉英语/语法不好......任何帮助/结论/建议表示赞赏。
delphi - 将 [array of byte] 分配给没有 Unicode 转换的 Variant
考虑以下代码片段(在 Delphi XE2 中):
Base64Val
是编码为 Base64 的二进制值(因此没有null
字节)。( OleVariant
)结果在客户端应用程序和 DataSnap 服务器之间自动编组和发送。
当我使用 Wireshark 捕获流量时,我看到两者都StrVal
被Base64Val
传输为 Unicode 字符串。如果可以的话,我想避免Base64Val
. 我查看了所有类型,除了可以传输字符数组Variant
之外没有其他任何东西。varString
我发现这个问题显示了如何创建一个变体字节数组。我在想我可以使用这种技术而不是使用AnsiString
. 不过我很好奇,是否有另一种方法可以将一组非 Unicode 字符数据分配给 Variant 而无需转换为 Unicode 字符串?
delphi - 如何在 Delphi XE4 中将 AnsiString 转换为 UnicodeString
我进行了上述转换,但它不起作用。我发现 str1 中丢失了一些数据。有没有一种安全的方法可以将 AnsiString 转换为 UnicodeString?
c++ - XE5 Ansi/Unicode 字符串链接器错误(未解决的外部问题)
在 XE5 中获得以下链接器错误的多个版本。
从到目前为止我读过的所有内容来看,这似乎是我在项目设置中的包含结构有问题,并且无法访问所有字符串方法的实际定义位置,但是对于我的生活,我无法弄清楚在哪里这些应该是。
delphi - 在具有 1251 代码页的计算机中使用 1252 代码页 AnsiString
DelphiXE 应用程序使用 ANSI 亚美尼亚字符 - 它们使用扩展 ASCII 字符集中的代码并且没有特殊的 CodePage。当计算机活动代码页为 1252 时,一切正常。当计算机 ACP 不是 1252(例如 1251)时,带有 ANSI 亚美尼亚字符的字符串的值会发生变化,并且应用程序无法正常工作。
我们尝试将这些变量设置为 AnsiString。没有结果。
这允许 Delphi 将字符串变量解释为使用 Delphi 2009 中的 1251 代码页进行编码。
它在 Delphi XE 中不起作用。
当计算机 ACP 不是 1252 时,我们如何使 Ansistring 变量被 Delphi 解释为使用 1252 代码页编码?
linker - XE6 Ansi/Unicode 字符串链接器错误(未解决的外部问题)
我的方案是将我的项目从 XE3 移植到 XE6。
当我将调用约定从 C 切换到 stdcall 时,我有这些未解决的外部变量。
从那里开始,UnicodeString()、~UnicodeString()(任何其他)变得无法解析。
我会比较 XE3 和 XE6 之间的 ustring.h。看起来那里有很多变化。
例如:UnicodeString 析构函数。
在 XE3 中,它被标记为:
在 XE6 中,它被标记为:
我将声明修改为:
这更正了链接器错误。
这是正常的吗,是正确的纠正吗?
要获得问题:
- 创建一个新的 C++ 包;
- 创建一个从 TEdit 派生的新组件,并将其添加到包中。
- 构建和链接 => 一切正常;
- 而不是去项目选项,并将调用约定切换到stdcall;
- 构建和链接 => 未解决的外部发生;
提前感谢您的回答。
N.福廷
c++builder - 如何使用 AnsiString 存储二进制数据?
我有一个简单的问题。
我想使用 AnsiString 作为二进制数据的容器。我主要从 TMemoryStream 或 TFileStream 加载此类数据,并在经过一些处理后从 AnsiString 将其保存回来。工作正常,没有发现问题。
但是从我所看到的使用它的情况来看,使用它会引起争论Sysutils::TBytes
。为什么?Sysutils::TBytes
例如,我可以用来操作存储在其中的数据的有用方法要少得多AnsiString
。与 AnsiString 相比,它显然是半成品容器。
是我应该关心转换为常规字符串的唯一问题,还是有其他原因为什么我应该真正使用不足之处TBytes
?我不会将 AnsiString 转换为其他字符串类型 - 这是在其他地方引用的可能问题。
我如何加载数据的示例:
我如何保存数据的示例:
那么正确存储二进制数据应该是安全的吗?
string - 使用 ansistring 时 FPC 退出代码 201。字符串不这样做
我有个问题。我写了这个小程序,它运行良好,直到我改变s
并s2
从string
ansistring。我需要使用 ansistring,因为它会超过 255 个字符。感谢您的答复。
delphi - Delphi - AnsiString 不等于但不知道为什么
我有一个 Tree 迭代的比较运算符。它使用 AnsiString 变量。我的问题是,当值看起来相等时,我没有得到相等的指示符(也就是没有从 System.AnsiStrings.CompareStr 得到 0)。我已经通过调试器查看了我的变量并单步执行了我的代码。两个变量都是 AnsiStrings,都是相同的值,并且没有空格。如果有帮助,CompareStr 返回 -65。
我可以忽略什么?这是我的代码。