有没有办法在Delphi 2009中查看字符是否使用1或2个字节?

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,或者如果是混合物.

Gre*_*ill 5

你可以检查一下这个角色的价值:

if ord(c) < 128 then
    // is an ascii character
Run Code Online (Sandbox Code Playgroud)

  • 既然您正在使用D2009,请查看新的TCharacter类,即:if TCharacter.IsLatin1(c)then (2认同)

Mic*_*sen 5

首先,请记住,您的数据库长度可能实际上是字符,而不是字节 - 您必须检查数据类型的文档。出于问题的目的,我将假设确实是后者。

字符串将使用的字节数完全取决于存储它的字符编码。如果它是 UTF-16(Delphi 中的默认字符串类型),则每个字符始终为 2 个字节,不包括代理项。

然而,假设数据库使用 Unicode 字符集,最可能的编码是 UTF-8。这是一种可变长度编码:字符可能需要 1 到 4 个字节之间的任何位置,具体取决于字符。您可以在维基百科上查看有关范围映射方式的图表。

但是,如果您根本不更改数据库架构,那么这必定意味着以下三件事之一:

  1. 目前,您以二进制方式存储所有内容,而不是文本方式(通常不是一个好的选择)
  2. 数据库已经存储了 Unicode 和计数字符,而不是字节(否则,您现在就会遇到问题,尤其是在重音字母的情况下)
  3. 数据库存储在单字节代码页中,例如 Windows-1252,完全阻止您存储 Unicode 数据(这不是问题,因为字符将以与以前相同的方式存储,尽管您无法使用统一码)

我对 Oracle 不熟悉,但如果你看看 MSSQL,它们有两种不同的数据类型:varchar 和 nvarchar。Varchar 以字节为单位计数,而 nvarchar 以字符为单位计数,因此适合 Unicode。另一方面,MySQL 只有 varchar,并且它总是以字符计数(从 4.1 开始)。因此,您应该检查 Oracle 文档和您的数据库模式,以获得关于这是否是问题的决定性答案。