Строковые литералы создаются с префиксом NULL (0)

Фон:

Я работаю над устаревшим кодом веб-приложения, и в настоящее время я конвертирую некоторые части кода ASCII в UNICODE. Я столкнулся со следующей ошибкой в ​​логгере. кажется, что строковые литералы либо созданы, либо по какой-то причине повреждены по пути.

Пример следующей строки — "%s::%s - Started with success." В памяти это выглядит так.

2AF9BFC   25 00 73 00 3A 00 3A 00  %.s.:.:.
02AF9C04  25 00 73 00 20 00 2D 00  %.s. .-.
02AF9C0C  20 00 53 00 74 00 61 00   .S.t.a.
02AF9C14  72 00 74 00 65 00 64 00  r.t.e.d.
02AF9C1C  20 00 77 00 69 00 74 00   .w.i.t.
02AF9C24  68 00 20 00 73 00 75 00  h. .s.u.
02AF9C2C  63 00 63 00 65 00 73 00  c.c.e.s.
02AF9C34  73 00 2E 00 00 00 00 00  s.......
02AF9C3C  00 00 00 00 00 00 00 00  ........

В журнале строка будет выглядеть следующим образом: -_S_t_a_r_t_e_d_ _w_i_t_h _s_u_c_c_e_s_s
Здесь пробел представлен здесь как обычно, а символ NULL представлен символом _ (_ является лишь примером, разные редакторы txt будут показывать его по-разному).

Я использую макрос _T, который заменяет строку на Unicode из того, что я изучаю Вот.

Почему я получаю префикс байта 0?

1

Решение

В терминологии Microsoft «Unicode» означает UTF-16 каждый символ представлен одним или двумя 16-разрядными кодовые единицы. Когда символ ASCII преобразуется в UTF-16, он будет представлен как единая кодовая единица с нулевым старшим байтом и младшим байтом, содержащим символ ASCII.

Если вы хотите, чтобы ваш файл журнала был читаемым как ASCII, вам нужно преобразовать ваш текст в UTF-8 при его записи. В противном случае убедитесь, что весь текст в файле журнала имеет формат UTF-16, и используйте программу чтения файлов журнала, которая понимает UTF-16, но обратите внимание, что вы будете тратить до 50% пространства, если большая часть текста имеет формат ASCII (поскольку каждую секунду байт будет 0).

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]