Tob*_*len 4 delphi unicode delphi-2009 character-encoding
Delphi 2009已将其字符串类型更改为使用2个字节来表示字符,这允许支持unicode字符集.现在当你得到sizeof(string)时,你得到length(String)*sizeof(char).Sizeof(char)目前为2.
我感兴趣的是,是否有人知道在逐个字符的基础上可以找出它是否适合单个字节的方式,例如找出char是ascii还是Unicode.
我最感兴趣的是,在我的字符串进入数据库(oracle,Documentum)之前,字符串将耗尽多少字节.
我们需要能够事先强制执行限制(因为我们拥有大量的安装基础),而无需更改数据库.如果字符串字段允许12个字节,则在delphi 2009中,长度为7的字符串将始终显示为使用14个字节,即使它到达数据库时,如果是ascii则仅使用7或如果是双字节则使用14,或者如果是混合物.
你可以检查一下这个角色的价值:
if ord(c) < 128 then
// is an ascii character
Run Code Online (Sandbox Code Playgroud)
首先,请记住,您的数据库长度可能实际上是字符,而不是字节 - 您必须检查数据类型的文档。出于问题的目的,我将假设确实是后者。
字符串将使用的字节数完全取决于存储它的字符编码。如果它是 UTF-16(Delphi 中的默认字符串类型),则每个字符始终为 2 个字节,不包括代理项。
然而,假设数据库使用 Unicode 字符集,最可能的编码是 UTF-8。这是一种可变长度编码:字符可能需要 1 到 4 个字节之间的任何位置,具体取决于字符。您可以在维基百科上查看有关范围映射方式的图表。
但是,如果您根本不更改数据库架构,那么这必定意味着以下三件事之一:
我对 Oracle 不熟悉,但如果你看看 MSSQL,它们有两种不同的数据类型:varchar 和 nvarchar。Varchar 以字节为单位计数,而 nvarchar 以字符为单位计数,因此适合 Unicode。另一方面,MySQL 只有 varchar,并且它总是以字符计数(从 4.1 开始)。因此,您应该检查 Oracle 文档和您的数据库模式,以获得关于这是否是问题的决定性答案。
| 归档时间: |
|
| 查看次数: |
3513 次 |
| 最近记录: |