что такое строка "^ A"? - PullRequest
       11

что такое строка "^ A"?

0 голосов
/ 17 ноября 2018

Я запускаю свой код в режиме онлайн.Я записываю строку, ключ.Ниже мой код:

fprintf(stderr, "key=%s, and key.size()=%d\n", key.c_str(), key.size());

Но результат таков:

key=^A, and key.size()=8

Я хочу узнать, что представляет собой ^A в ascii.Размер ^A равен 2, а не 8, но он показывает, что он равен 8. Я смотрю результат с помощью vim, а файл log_file кодируется с помощью UTF-8.Почему?

Ответы [ 2 ]

0 голосов
/ 17 ноября 2018

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

Другие зрители могут сделать разные выборы по обоим пунктам или позволить вам указать, что вы хотите. Например, управляет символами изображения (␁) вместо знака каретки.

Для std:string c_str() завершается дополнительным байтом \x00 после фактического значения. Вы часто используете c_str() с функциями, которые ожидают завершения строки \x00. Это относится к fprintf. В таких случаях прочитанное заканчивается как раз перед первым увиденным \x00.

В вашей строке несколько \x00 байт, что, конечно, способствует size(), но fprintf остановится прямо на первом (и не будет считаться).

0 голосов
/ 17 ноября 2018

Я решил это сам. Если вы напишите std :: string "\ x01 \ x00 \ x00 \ x00 \ x00end" в файл и позже откроете его с помощью vim, вы получите '^ A'.

Это мой тестовый код:

string sss("\x01\x00\x00\x00\x00end");
ofstream of("of.txt");
for (int i=0; i<sss.size(); i++) {
    of.put(sss[i]);
}

of.close();

После того, как я открыл файл «of.txt», я увидел «^ A»;

...