将C字符串转换为Pascal字符串时,为什么原始字符串的长度应小于或等于127而不是256?我知道unsigned int的范围是0~256,有符号的范围是-128~127,但是不是无符号的Pascal字符串的第一个字符?
答案 0 :(得分:2)
您所指的Pascal字符串可能是较旧的Pascals中使用的字符串(在例如Delphi和FreePascal中称为ShortString
,这是目前最流行的Pascal实现)。这可以包含255个单字节字符(C中为char
)。 无需将此限制为127个字符。
也许您在想255个字节只能包含127个UTF-16代码点。但是这些字符串在旧的CP / M和DOS时代很流行,当时还没有人知道任何关于Unicode的东西,并且它们被用来包含ASCII或"扩展的ASCII" (8位,使用代码页)。
但是大多数现代Pascal实现允许您使用最大2 GB的字符串。在那里,长度指示器不再存储为第一个元素,只是接近文本数据。现在,大多数这些字符串也可以包含Unicode,可以是UTF-16或UTF-8,具体取决于您选择的字符串类型(现代Pascal实现有多种不同字符串类型用于不同目的,所以没有一个" Pascal字符串类型"再也没有了。
有些语言可以限制ShortString
的大小,正如所谓的"计数"字符串:
var
s: string[18];
该字符串最多包含18个字节的文本数据和1个字节的长度数据(在索引0处)。这些较短的字符串可以用在记录中,因此它们不会变得太大。
答案 1 :(得分:1)
FreePascal的wiki有一个很棒的页面,显示Pascal(至少是那个实现)支持的所有字符串类型:http://wiki.freepascal.org/Character_and_string_types - 它包括长度前缀和以null结尾的字符串类型。该页面上的所有类型都没有长度限制为127。
您所引用的字符串类型将匹配具有单字节前缀的ShortString
,但是他们的文档声明它接受0-255。
我知道一个带有 variable-length-integer 前缀的字符串类型,如果您希望内存中表示为二进制,则会将字符串的长度限制为127个字符 - 与ShortString
兼容,因为128个字符或更长会将MSB位设置为1
,其中可变长度整数表示整数至少为2个字节而不是1个字节。