Разные типы строк и символов

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Разные типы строк и символов

Сообщение SII » 11.04.2008 23:46:22

Как известно, в Дельфи есть три типа строк: ShortString, AnsiString, WideString. С первым типом всё ясно: это старый, ещё турбопаскалевский тип, содержащий однобайтовые символы, имеющий фиксированную максимальную длину и фактически являющийся массивом. С WideString тоже в общем всё ясно: строка переменной длины, состоящая из двухбайтовых символов и физически размещаемая в динамической памяти, причём о выделении/освобождении памяти заботится компилятор без явного вмешательства программиста.

А вот AnsiString вызывает вопросы. Какая длина хранящихся в ней символов в байтах? Как соотносятся строки этого типа со стандартной однообайтовой ANSI-кодировкой и с юникодом? Что такое многобайтовые системы символов и с чем их едят?

Просьба знакомых с этой темой поделиться ссылками на вразумительные описания, касающиеся как Дельфи, так и FPC.
SII
новенький
 
Сообщения: 64
Зарегистрирован: 24.06.2007 17:15:09
Откуда: Зеленоград

Сообщение SII » 12.04.2008 19:05:31

Так, с кодировками разобрался, спасибо добрым людям: http://ru.wikipedia.org/wiki/UTF-8. Осталось разобраться с тем, как конкретно всё это поддерживается компиляторами и библиотеками...
SII
новенький
 
Сообщения: 64
Зарегистрирован: 24.06.2007 17:15:09
Откуда: Зеленоград

Сообщение FedeX » 13.04.2008 01:18:01

По умолчанию в Делфи тип String это и есть AnsiString - по-сути указатель на строку(массив) в памяти, с однобайтовыми символами, заканчивающююся нулём. Сам указатель, если не ошибаюсь хитрый, содержит в себе ещё и длину строки. Вообще это такой же тип как и WideString только каждый символ один байт в кодировке ANSI, а WideString имеет кодировку UTF-16. Вродь так...
... А вообще компилятору, если не ошибаюсь, плевать на кодировку, если только ты не создаёш строковых констант. Так ты можеш хранить в AnsiString-е текст с любой другой однобайтовой кодировкой :roll:
Аватара пользователя
FedeX
постоялец
 
Сообщения: 422
Зарегистрирован: 27.03.2006 09:25:34
Откуда: украина, житомир

Сообщение SII » 13.04.2008 11:25:38

Судя по дельфозному хелпу (для дельфи 2006), AnsiString вовсе не обязательно является строкой однобайтовых символов -- такие символы являются лишь частным случаем. Имеется целый ряд функций, который принимает параметры типа AnsiString, но считает, что строки закодированы в UTF-8 (переменная длина символа) -- эти функции с Ansi начинаются.

А двухбайтовые строки (WideString) -- это, судя по всему, не UTF-16 (где бывают двух- и четырёхбайтовые символы), а UCS-2 (подмножество UTF-16, включающее только двухбайтовые символы).

AnsiString включают не только указатель на собственно строку, но ещё и длину строки, и счётчик её использования. В WideString есть длина строки, но счётчика использования нет, т.е. присваивание одной строки другой неизбежно вызывает полное копирование всей строки, что не есть хорошо.

Вот интересно, как с этим дело во ФриПаскале обстоит? И какую часть работы по обслуживанию строк выполняет компилятор, а какую -- его библиотека (которую можно переписать без внесения изменений в компилятор)?
SII
новенький
 
Сообщения: 64
Зарегистрирован: 24.06.2007 17:15:09
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin » 13.04.2008 12:23:51

В FPC дела обстроят практически так же, как и в Дельфи. Но есть и определенная разница:

- WideString на всех платформах, кроме Windows, имеет счетчик ссылок - в точности как AnsiString. На Windows есть переменная winwidestringalloc, при установке которой в false память под WideString выделяется не Windows, а своей библиотекой. Из-за этого оно становится несовместимым с COM, но работает чуть побыстрее.

- За работу с WideString, в частности, перекодировку их в AnsiString и обратно, отвечает WideStringManager (переменная модуля system - запись из нескольких функций), который можно легким движением руки заменить на все что угодно. В Linux этот менеджер реализован в отдельном модуле cwstring, который надо подключать вручную.

- Функции, начинающиеся с Ansi*, находятся в зачаточном состоянии, потому что они просто никому никогда не были нужны. Строго говоря, функции работы с UTF-8 нужны, и они есть (модули freebidi, utf8bidi и еще, если поискать, найдется не одна), но FPC предполагался совместимым где-то с Дельфи 7, в котором Ansi*-функции работали не с utf-8, а черт знает с чем.

Так вот как-то, в общих чертах...
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Cheb » 13.04.2008 13:20:26

В fpc есть ф-ии Utf8Encode() и Utf8Decode(), для преобразования между AnsiString, в которой хранится переменно-байтовый utf8, и WideString, которая ucs16.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Сообщение *vmr » 14.04.2008 14:40:15

>В fpc есть ф-ии Utf8Encode() и Utf8Decode(), для преобразования между AnsiString, в которой хранится переменно-байтовый utf8, и WideString, которая ucs16.
Кстати в дельфе тоже есть такие же функции
Правда эти ф-и лепят еще и отсябятину вроде byte-order и других служебных кодов (так обстоит в Delphi7, что в FPC я не знаю)
Аватара пользователя
*vmr
постоялец
 
Сообщения: 168
Зарегистрирован: 08.01.2007 01:46:07
Откуда: Киев

Сообщение SII » 15.04.2008 01:23:03

Спасибо за инфу, будем продолжать разбираться :)
SII
новенький
 
Сообщения: 64
Зарегистрирован: 24.06.2007 17:15:09
Откуда: Зеленоград


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

Рейтинг@Mail.ru