Эксперт
Покинул форум
Сообщений всего: 4465
Дата рег-ции: Нояб. 2017
Репутация: 585
|
read_u - функция читает текстовый файл в кодировке UTF-16, UTF-8, UTF-8 без bom.
Принимает в качестве параметра путь к файлу. Возвращает содержимое файла в виде строки.
write_u - функция записывает/дописывает текстовый файл в кодировке UTF-16, UTF-8.
Принимает параметры:
1. Строку, которую нужно записать/дописать в файл.
2. Путь к файлу.
3. Режим записи (wb) или дозаписи (ab).
4. В какой кодировке сохранить файл utf-16 или utf-8.
Пример1. Записать файл в кодировке UTF-16 и потом его прочитать. (Отобразить)CODE:external(INT, "MultiByteToWideChar", "MultiByteToWideChar", "Kernel32.dll");
external(INT, "WideCharToMultiByte", "WideCharToMultiByte", "Kernel32.dll");
string path="C:\11111.txt"; // куда сохранить файл
string encoding="utf-16"; // в какой кодировке сохранить файл
string rn=formatic(13)+formatic(10); // перенос строки
string s="Hello!!!"+rn; // строка
string ss="Привет!!!"+rn; // строка
// записать в текстовый файл в кодировке utf-16
write_u(s, path, "wb", encoding); // записать в файл строку s
write_u(ss, path, "ab", encoding); // дописать в файл строку ss
write_u("Текст, text."+rn, path, "ab", encoding); // дописать в файл 'Текст, text.'
sleep(1000);
start(path); // открыть файл
string sss=read_u(path); // прочитать содержимое файла в строку
messagebox("Содержимое файла: "+rn+sss);
string P[100];
int x=regexsearch(sizearray(P), #P[0], sss, ".*\r\n"); // разделить текст на строки
if(x>0)
{
for(int i=0; i<x; i++)messagebox(P[i]); // показать каждую строку в сообщении
}
function write_u(string S, string path, string mode, string encoding)
{
new char c[size(S)+1]; // массив для строки ascii
new char c2[sizearray(c)*2]; // массив для строки utf-16
new char c3[sizearray(c)*2]; // массив для строки utf-8
strcpy(#c[0], S);
int x=MultiByteToWideChar(1251, 0, address(#c[0]), sizearray(c), address(#c2[0]), sizearray(c2));
if(x>0)
{
if(fopen(path, mode)>0) // если файл открылся
{
if(encoding=="utf-16") // если utf-16
{
if(mode=="wb"){fwriteb(formatic(255));fwriteb(formatic(254));} // пишем маркер байтов
fwriteb(#c2[0], (x-1)*2); fclose(); // пишем всё что в массиве
}
else
{
if(encoding=="utf-8") // если utf-8
{
x=WideCharToMultiByte(65001, 0, address(#c2[0]), sizearray(c2)/2, address(#c3[0]), sizearray(c3), 0, 0);
if(x>0)
{
if(mode=="wb"){fwriteb(formatic(239));fwriteb(formatic(187));fwriteb(formatic(191));} // пишем маркер байтов юникода
fwriteb(#c3[0], x-1); fclose(); // пишем всё что в массиве
}
}
else messagebox("Недопустимый формат");
}
}
}
delete c;
delete c2;
delete c3;
}
function read_u(string path)
{
char c[999999];
int count_symbol, start_pos, x;
string S="";
if (fopen (path, "rb")!=0)
{
count_symbol=freadb(#c[0], sizearray(c)); fclose();
// Определение кодировки по маркеру последовательности байтов
if(codhexi(#c[0], 2)==65279)start_pos=2; // UTF-16 (обратный порядок байт)
else
{
if(codhexi(#c[0], 3)==12565487)start_pos=3; // UTF-8
else start_pos=0; // без маркера
}
///////
if(start_pos==2) // если UTF-16
{
count_symbol=(count_symbol-1-start_pos)/2; // количество символов в файле
new char c2[count_symbol+1];
x=WideCharToMultiByte(1251, 0, address(#c[start_pos]), count_symbol, address(#c2[0]), sizearray(c2), 0, 0);
if(x>0){S=format(#c2[0], count_symbol); delete c2;}
}
else // если UTF-8
{
count_symbol=count_symbol-4; // количество символов в файле
new char c3[count_symbol*2+1];
x=MultiByteToWideChar(65001, 0, address(#c[start_pos]), count_symbol, address(#c3[0]), sizearray(c3)); // из utf-8 в utf-16
if(x>0)
{
new char c2[x+1];
x=WideCharToMultiByte(1251, 0, address(#c3[0]), x, address(#c2[0]), sizearray(c2), 0, 0); // из utf-16 в 1251
if(x>0){S=format(#c2[0], x); delete c2;}
}
delete c3;
}
}
else messagebox("Файл не открылся");
return S;
}
Пример2. Прочитать файл в unicode и сохранить в ansi. (Отобразить)CODE:external(INT, "MultiByteToWideChar", "MultiByteToWideChar", "Kernel32.dll");
external(INT, "WideCharToMultiByte", "WideCharToMultiByte", "Kernel32.dll");
string path="C:\11111.txt"; // путь к файлу в unicode
string path2="C:\22222.txt"; // куда сохранить в ansi
string s=read_u(path); // прочитать содержимое файла в строку
if(fopen(path2, "w")>0) // если файл открылся
{
fwrite(s); fwrite(ENDL); // записать строку в файл
fclose();
}
else messagebox("Файл не открылся");
function read_u(string path)
{
char c[999999];
int count_symbol, start_pos, x;
string S="";
if (fopen (path, "rb")!=0)
{
count_symbol=freadb(#c[0], sizearray(c)); fclose();
if(codhexi(#c[0], 2)==65279)start_pos=2;
else
{
if(codhexi(#c[0], 3)==12565487)start_pos=3;
else start_pos=0;
}
if(start_pos==2)
{
count_symbol=(count_symbol-1-start_pos)/2;
new char c2[count_symbol+1];
x=WideCharToMultiByte(1251, 0, address(#c[start_pos]), count_symbol, address(#c2[0]), sizearray(c2), 0, 0);
if(x>0){S=format(#c2[0], count_symbol); delete c2;}
}
else // если UTF-8
{
count_symbol=count_symbol-4;
new char c3[count_symbol*2+1];
x=MultiByteToWideChar(65001, 0, address(#c[start_pos]), count_symbol, address(#c3[0]), sizearray(c3));
if(x>0)
{
new char c2[x+1];
x=WideCharToMultiByte(1251, 0, address(#c3[0]), x, address(#c2[0]), sizearray(c2), 0, 0);
if(x>0){S=format(#c2[0], x); delete c2;}
}
delete c3;
}
}
else messagebox("Файл не открылся");
return S;
} |