Male C. Pig a.k.a. Svinopolist (piggymouse) wrote,
Male C. Pig a.k.a. Svinopolist
piggymouse

[programming] Женская логика

Задачка для знатоков C++ и Unicode. Компилим код, содержащий следующий кусочек, с помощью MSVC6/SP6 на машине с Windows 2000 и ANSI codepage 1251. Вопрос: что выдаст printf? Для справки: U00C5 есть "Å".

wchar_t* pszLatin1String = L"\x00C5";
printf("U%04X\n", (unsigned int) *pszLatin1String);

Вы усцытесь, но выдано будет U0415, сиречь код русской буквы "Е".

То бишь, анализатор MSVC выделяет лексему \x00C5, внимательно смотрит на неё и решает — раз значение восьмибитное, хер с ним, с контекстом юникодного строкового литерала, давайте преобразуем это восьмибитное значение в Юникод, используя текущий пользовательский codepage. А C5 в CP1251 отображается, само собой в U0415, CYRILLIC CAPITAL LETTER IE. Что и попадает в результате в юникодную константу.

Subj?

"C++ Lexical Conventions" в MSDN, разумеется, ничего такого не говорит. Читать стандарт не пойду, потому что просто противно.

Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 28 comments