Капризы RawByteString Delphi 2009

Существует ли типобезопасный способ выполнения ожидаемого (). to.deep.equal ()

Не входит в определения типов equal, которые намеренно any ], поскольку он предназначен для проверки во время выполнения .

Однако легко сделать внешне:

const expected: Foo = {
  bar: 'hello',
  baz: 'world',
};
expect(getFoo()).to.deep.equal(expected);
5
задан Marek Jedliński 31 January 2009 в 16:13
поделиться

2 ответа

RawByteString только существует для уменьшения количества перегрузок, требуемых для функций, которые работают с различными ароматами AnsiStrings с различным сродством кодовой страницы.

В целом не объявляйте переменные типа RawByteString. Не преобразовывайте тип значений к тому типу. Не делайте конкатенаций на переменных того типа. О единственных вещах можно сделать:

  • Объявление параметра этого типа (исходное намерение)
  • Индексация на таком параметре
  • Поиск в таком параметре
  • Интеллектуальные операции, которые проверяют фактическую кодовую страницу строки, с помощью StringCodePage функция.

Например, Вы отметите что StringCodePage функционируйте самостоятельно использует RawByteString как его тип аргумента. Таким образом, это будет работать с любым AnsiString, вместо того, чтобы делать перевод кодовой страницы прежде, чем передать его как аргумент.

Для Вашего случая вещи как конкатенации в основном не определены. Поведение, измененное между RTM и Обновлением 2, но когда функции конкатенации строк RTL получают несколько строк с различными кодовыми страницами, нет никакого простого способа к нему для выяснения, какая кодовая страница должна использоваться для заключительной строки. Это - всего одна причина, почему Вы не должны связывать их как Вы, делают здесь.

9
ответ дан 13 December 2019 в 22:18
поделиться

Вы не можете добавить строку к TMemo, "как". Вам всегда нужно к так некоторому преобразованию в Unicode, потому что это - весь TMemo, знает о в Delphi 2009.

Если Вы хотите притвориться, что Ваш UTF8String использует кодовую страницу 1252, сделайте это:

var
  utf8Str : UTF8String;
  Raw: RawByteString;
begin
  utf8Str := '€ąćęłńóśźż';
  Raw := utf8Str;
  SetCodePage(Raw, 1252, False);
  Memo.Lines.Add(Raw);
end;

Для получения дополнительной информации см. мою статью Using RawByteString Effectively

1
ответ дан 13 December 2019 в 22:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: