AnsiChar или UTF8Char?

SOFT FOR YOU
Дата: 15.02.2014 11:33:41
Какой тип символов в ShortString?
AnsiChar или UTF8Char ?
white_nigger
Дата: 15.02.2014 16:02:54
А какая разница? Восьмибитный, да и ладно. А если учитывать, что ShortString это синоним для стандартной строки Turbo Pascal - то тогда никаким юникодом в паскале не пахло
SOFT FOR YOU
Дата: 15.02.2014 16:34:42
white_nigger

ну я сейчас клепаю библиотеку, работающую с текстом, с различными кодировками
и мне нужно знать: ansi он или utf8 :)

раньше, насколько я понимаю, это был AnsiChar
а сейчас в коде того же TObject.ClassName вижу, что он используется как utf8

Вот я и в непонятках
ShortString и все, все, все
Дата: 15.02.2014 18:06:09
Ситуация с ShortString "сейчас" не отличается от ситуации с ShortString "тогда". Тип ShortString предназначен для обеспечения обратной совместимости и поэтому не меняется (в отличие от родных строк Delphi). Что сейчас в ShortString может лежать 1251, 866, 65001 - так ровно так же "тогда" в ShortString могло лежать 1251 (в 99% случаев), 866 (для вывода на консоль), 65001 (крайне редко).

Ситуация и "тогда" и "сейчас" заключается в том, что в ShortString может лежать что угодно - всё зависит от того, как трактовать содержимое. Чтобы интерпретировать байты как текст, нужно указание кодировки:
  • В (новых) String, AnsiString, UnicodeString, WideString, PChar, PWideChar оно (указание кодировки) - есть: либо как явное поле в структуре строки (String, AnsiString, UnicodeString), либо как неявно предполагаемая фиксированная кодировка (WideString, PChar, PWideChar).
  • В (старых) String, AnsiString, ShortString, PAnsiChar, PChar его (указания кодировки) - нет. Соответственно, содержимое последних не может трактоваться само по себе, без указания кодировки программистом.

    К примеру, как правило в однобайтовых строках, которые сами не указывают кодировку своих данных, хранятся данные в текущей кодовой странице системы (GetACP, CP_ACP). Под Windows это будет 1252, 1251 и т.п. Под какой-нибудь Linux это скорей всего будет 65001.

    Второй пример: RTTI в качестве хранилища имён классов использует ShortString в UTF8 - кодировка задаётся фиксировано.

    Третий пример: для вывода на консоль строки преобразовывают в OEM-кодировку (GetConsoleOutputCP, CP_OEMCP). Соответственно, если программист выводит данные через вышеуказанные типы без указания кодировки, то он вручную и явно будет указывать кодировку - через применение функции перекодировки с фиксированной кодовой страницей (типа AnsiToOEM), либо передавая кодировку константой (типа WideCharToMultiByte).

    В итоге: невозможно трактовать содержимое PAnsiChar, ShortString, а также (в D2007 и ниже) String, AnsiString и PChar "в абстрактном вакууме", без указания кодировки. Чтобы интерпретировать эти данные, нужно предусмотреть параметр для передачи кодовой страницы.

    Примечание: поскольку 99% однобайтовых строк в программе используют текущую кодовую страницу, то этот параметр нужно сделать опциональным, со значением по умолчанию = 0 (что эквивалентно GetACP).
  • SOFT FOR YOU
    Дата: 15.02.2014 18:22:26
    Оч достойный ответ
    Большое спасибо!
    Anatoly Podgoretsky
    Дата: 15.02.2014 22:17:22
    Тут все понятно, начиная с какого то времени - вместо AnsiString английской кодировки используется Utf8String. Это сделано для того что бы уменьшить проблемы на системах с неанглийкой ANSI кодировкой.
    Узнать легко по наличию 0xC0 to 0xFD в символах. Эти коды отсутствуют в ANSI любой кодировки
    SOFT FOR YOU
    Дата: 16.02.2014 02:28:17
    Anatoly Podgoretsky,

    т.е. Вы утверждаете, что ShortString без указания кодировки это UTF8, а не DefaultCodePage?
    rgreat
    Дата: 16.02.2014 02:34:05
    SOFT FOR YOU,

    ShortString это не более чем массив от 1 до 256 байт.
    Хранится там может что угодно.
    SOFT FOR YOU
    Дата: 16.02.2014 11:18:08
    rgreat
    ShortString это не более чем массив от 1 до 256 байт.
    Хранится там может что угодно.

    Оно конечно логично
    Только вот Анатолий Подгорецкий утверждает другое
    Фигура он весомая, поэтому не могу не прислушиваться

    Anatoly Podgoretsky
    Узнать легко по наличию 0xC0 to 0xFD в символах. Эти коды отсутствуют в ANSI любой кодировки

    http://ru.wikipedia.org/wiki/Windows-1251
    rgreat
    Дата: 16.02.2014 14:53:54
    SOFT FOR YOU,

    А он разве чтото другое сказал?