суббота, 11 декабря 2010 г.

CP_ACP против GetACP

Это перевод CP_ACP vs. GetACP. Автор: Майкл Каплан.

Несколько дней назад PEK спросил в newsgroups насчёт WideCharToMultiByte и MultiByteToWideChar:
Я несколько смущён первым параметром в MultiBytToWideChar. Он говорит какую использовать кодовую страницу. Вы можете использовать значение CP_ACP ("кодовая страница ANSI"), но что оно означает? Это значение, возвращаемое GetACP или это просто кодовая страница 1252?

Я хочу знать, одинаковые ли результаты дают вызовы:
MultiByteToWideChar(CP_ACP, ...)
и:
MultiByteToWideChar(GetACP, ...)
Ответ: они действительно действуют одинаково. Первый способ - это константа, которая говорит: "меня не волнует, какая сейчас у системы кодовая страница - просто используй её". А второй способ сначала спрашивает "какая у системы кодовая страница по умолчанию?".

Естественный вопрос: почему есть два способа добиться одного и того же. И какой из них будет быстрее - кэширование GetACP, либо передача CP_ACP?

Ну, на NT платформах CP_ACP немного быстрее. И под "немного" я имею ввиду, что на 1'000'000 итераций вы заметите лишь незначительную разницу. На платформах 9x непосредственное значение кодовой странице может быть даже чуть более быстрым, но не настолько, чтобы это имело значение. Я предпочитаю способ с CP_ACP, потому что он кажется мне проще в отслеживании. Для вас это может и не иметь значения.

P.S. OK, мне выпал шанс заглянуть в исходный код Win9x, и я изменил своё мнение. Я могу явно увидеть разницу; CP_ACP будет медленее. Не намного, но это не самый лучший кусок кода, что я видел. Я также понимаю, почему этот код не используется в коде NT. Кстати, MSLU была написана с использованием метода с кэшированием кодовой страницы, основываясь на чьём-то комментарии о том, что этот способ немного быстрее на Win9x. Ну, комментарий был прав и я рад, что MSLU так делает.

Итак, а если вы используете .NET Framework, то у вас, вероятно, возник вопрос - что быстрее: использование Encoding.Default, или использование метода Encoding.GetEncoding для создания отдельного объекта Encoding. И быстрый ответ заключается в использовании Encoding.Default - поскольку это всегда быстрее.

Но лучший ответ - это тот, который даёт Shawn Steele (владелец кодировок и кодовых страниц): используйте Unicode и вы избежите всей этой дополнительной работы. Это намного проще, особенно если учесть что все данные и так уже в Unicode...

This post brought to you by "" (U+fe4c , a.k.a. DOUBLE WAVY OVERLINE)

Комментариев нет:

Отправить комментарий

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку (поддерживается OpenID).

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

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