О, блерг!Это случилось снова.Я родом из ассемблера, поэтому иногда некоторые вещи из C ++ приводят меня в замешательство.Одна вещь, которую я постоянно забываю, это то, как в C ++ компилятор может автоматически компенсировать размеры шрифтов при вычислении индексов, указателей и т. Д.
Например:
DWORD dwa[4] = {1,2,3,4};
//dwa[2] references the third DWORD in the array (i.e., the ninth BYTE),
//NOT the second BYTE in the array
или
struct EGS {
char str[5];
int num;
};
EGS eg = {0};
EGS* peg = ⪚
peg++;
//peg is incremented by a whole EGS’ worth of bytes, NOT just 1
//for EGS, it is increased by 12 (5+4=9, rounded to the nearest 4, equals 12)
В этом случае, поскольку аргументы интерпретируются как широкие (2-байтовые) символы, argv[1][1]
не является нулевым символом, это второй символ Юникода.
Использование программы каки передав символ Unicode, я получаю следующее:
C:\>unicodeargtest ‽‽‽‽
203d, 203d, 203d, 203d
Я просто вставил interrobangs в командную строку.В моем обычном режиме командной строки (с использованием растровых шрифтов и кодовой страницы 437) они отображаются как ?
вместо ‽
, но все равно дают те же результаты.
Приведя аргументы к char
или BYTE
следующим образом:
printf("%x, %x, %x, %x\n",
((BYTE*)(argv[1]))[0], ((BYTE*)(argv[1]))[1],
((BYTE*)(argv[1]))[2], ((BYTE*)(argv[1]))[3]
);
, я получу ожидаемые результаты:
C:\>unicodeargtest ‽‽‽‽
3d, 20, 3d, 20
C:\>unicodeargtest Foobar
46, 0, 6f, 0
Вставка символов Unicode работает, но использование командного файла все еще не работает.У Unicode все еще есть проблема с неверно интерпретируемым именем файла программы из-за нулевых символов, и сохранение его как UTF-8 приводит к тому, что не запускается вообще .