Delphi 2009 + Unicode + символьный размер

Попробуйте использовать Database SetInitializer, который принадлежит к использованию System.Data.Entity;

В Global.asax

protected void Application_Start()
{
    Database.SetInitializer(new DropCreateDatabaseIfModelChanges<yourContext>());
}

Это создаст новую базу данных каждый раз, когда ваша модель будет изменена. Но ваша база данных будет пустой. Чтобы заполнить ее фиктивными данными, вы можете использовать Seeding. Который вы можете реализовать как:

Посев ::

protected void Application_Start()
{
    Database.SetInitializer(new AddressBookInitializer());
                ----rest code---
}
public class AddressBookInitializer : DropCreateDatabaseIfModelChanges<AddressBook>
{
    protected override void Seed(AddressBook context)
    {
        context.yourmodel.Add(
        {

        });
        base.Seed(context);
    }

}
6
задан RRUZ 15 April 2011 в 06:24
поделиться

6 ответов

С Unicode SizeOf (SomeChar) <> Длина (SomeChar). По существу длина строки является меньше затем суммой размера ее символов. Пока Вы не принимаете SizeOf (Символ) = 1 или SizeOf (SomeString[x]) = 1 (так как оба - ЛОЖЬ теперь), или попытайтесь обменяться байтами с символами, затем Вы не должны испытывать затруднения. Любое место Вы делаете что-то творческие Байты наполнения в Символы или Строки, затем необходимо будет использовать AnsiString.

(SizeOf (SomeString) равняется все еще 4, неважно, длина, так как это - по существу указатель с некоторым волшебством компилятора.)

5
ответ дан 10 December 2019 в 00:46
поделиться

Люди часто неявно преобразовывают от символов до байтов в старом коде Delphi, действительно не думая об этом. Например, при записи в поток. Когда Вы пишете строку в поток, необходимо указать число байтов, которые Вы пишете, но люди часто передают счетчик символов вместо этого. См. это сообщение от Chris Bensen для другого примера.

Другим путем люди часто делают это неявное преобразование, и более старый код при помощи "строки", чтобы хранить двоичные данные. В этом случае они на самом деле хотят байты, но тип данных ожидает символы. D2009 имеет лучший тип для этого.

4
ответ дан 10 December 2019 в 00:46
поделиться

Я не попробовал Delphi 2009, но использую fpc, который также переключается на unicode медленно. Я на 95% уверен, что все ниже также содержит для Delphi 2009

В fpc (при поддержке unicode) это будет так, чтобы функции как 'длина' приняли кодовую страницу во внимание. Таким образом это возвратит длину строки, поскольку 'человек' видел бы его. Если существует - например - два китайских символа, это оба берет два байта памяти в unicode, длина возвратится 2, так как существует два символа в строке. Но строка возьмет 4 байта памяти. (+the память для подсчета ссылок и ведущего № 0, но этого в стороне)

Что Вы не можете сделать, больше это:

var p : pchar;
begin
  p := s[1];
  for i := 0 to length(string)-1 do
    begin
    write(p);
    inc(p);
    end;      
end;

Поскольку этот код будет - в двух китайско-символьных примерах - пишут неправильные два символа. А именно, два байта, которые являются частью первого 'реального' символа.

Короче говоря: Длина () не возвращает сумму байтов, выделенных для строки больше, но количества символов. (Прежде чем переключатель к unicode, те два значения были равны друг другу),

1
ответ дан 10 December 2019 в 00:46
поделиться

Фактический размер символа не должен иметь значения, если Вы не делаете управление на уровне байта.

0
ответ дан 10 December 2019 в 00:46
поделиться

Позволяет не, забывают, что существуют времена, когда это преобразование не действительно желаемо. Скажите для хранения GUID в записи, например. Гуид может только содержать шестнадцатеричные символы плюс - и скобки... заставляющие их поднимать дважды пространство, могут оказать настоящее влияние на существующий код. Уверенный простое решение состоит в том, чтобы изменить их на AnsiString и соглашение с предупреждениями компилятора, если Вы делаете какую-либо обработку строк на них.

0
ответ дан 10 December 2019 в 00:46
поделиться

(Конечно, если я использую строки в качестве строк а не хранить какие-либо другие данные),

Это - ключевой пункт, ВЫ не используете строки для других целей, но некоторые люди делают. Они используют строки точно так же, как массивы, таким образом, они (и это включает меня), должен был бы проверить все такое использование, чтобы удостовериться, что ничто не повреждается...

0
ответ дан 10 December 2019 в 00:46
поделиться
Другие вопросы по тегам:

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