• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

  • 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Проблема с записью в файл(utf-8)

  • Автор темы solova
  • Дата начала
S

solova

Пишу в MS Visual , C++.
В общем проблема такая.

открываю файл в бинарном режиме(чтобы fseek ftell правильно работали)
fopen_s(&file,"test.xml","r+b");
в файле английский текст формата UTF-8
встаю в файле на определённую позицию
создаю переменную и инициализирую
char ch[2]="Ж";

И вот вопрос .Как записать её в файл?

как я понял русский символ занимает 2 байта ,а английский -1 байт.
если я из переменной ch записываю 2 байта то фигня в файле какая то происходит (открываю файл через Notepad++ и на месте записи чёрным выделено (16-ричное значение)если переменная "Ж"то оно равно"C6" -первый байт и надпись (NUL)-второй байт)
если в ручную прописать русскую букву то всё правильно отображает

короче пробовал по разному получалось всякое но не то что надо.


заранее спасибо за помощь.
 
R

romanriddick

ха-ха .... значет так , вот ето
char ch[2]="Ж";

означет что вы обявляете массив ch[2] розмерностю 2 (не байт , а строк!!!) и НУЛЕВОМУ символу присваеваете "Ж" .
Тогда запись (под MS Visual C++. не пишу , по етому что не знаю как записывать в файл) нужно делать так
fprint_s("test.xml","ch[0]")
добавляэм ch в конец файла

для уверенности пишем char ch[2]="Ж";
двумя строками
char ch[2];
ch[0]="Ж";

а то фиг ево знает что там MS намутило в своем компиляторе)))
 
S

solova

ха-ха .... значет так , вот ето
char ch[2]="Ж";
даа ,тут я уже запарился,
char ch[2];
ch[0]='Ж';

делал так но после записи снова отображается символы "C6"выделенные чёрным а через простой нотепад это выглядит как квадратик

кодировки не сходятся наверно
 
R

romanriddick

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

если не сработает на крайняк посмотрите коды ISO ... например chr(54) где chr ето функция которая преобразует код в символ 54 -- ваш символ
ето 100 процентный метод , он не зависит от кодировок
П.С.: в назве функции я не уверен , поищите в инете "робота с строками" ... етот метод я применял к vba+excel , все работало
 
S

solova

1)нет , не должны .пробуйте целый файл присвоить динамическому массиву , потом сотритувсе данные в файле и опять запишите их в файл

2)если не сработает на крайняк посмотрите коды ISO ... например chr(54) где chr ето функция которая преобразует код в символ 54 -- ваш символ
ето 100 процентный метод , он не зависит от кодировок
П.С.: в назве функции я не уверен , поищите в инете "робота с строками" ... етот метод я применял к vba+excel , все работало

1)файлы больших размеров 1-2МБ -большие массивы,много времени.
я пытался вставить строчку целиком в месте с русским символом-не получалось(та же хрень).
2)в кодировках я полный ноль
посмотрел про chr()
как я понял ей надо передать код символа из таблицы UTF-8?
и как её записывать ?
например fwrite(chr(QWER),1,sizeof(chr(QWER)),&File);?
тут в первой переменной надо передавать указатель на строку или саму строку, а "chr(QWER)" сойдёт на указатель?
пс: А понял её надо присваивать переменной char-а или string-а и переменную уже в функцию записи пихать
(не на своём компе-не могу проверить)
 
R

romanriddick

если QWER ето переменная типа int то да
fwrite(chr(QWER),&File); записываем в конец файла
посмотрел в книге , код Ж ето 134 ... но не написано в какой кодировке
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!