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).
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?