Проблемы с кодированием при написании текста с использованием delphi

Я пишу php-файл, но у меня возникла проблема именно в этой строке

Writeln(f,'<(meta http-equiv="Content-Type" content="text/html; charset=utf-8" /)>');
/note i used a coupla extra ( )

Это пишет глава моей веб-страницы.

Если я достану его, все персонажи будут идти гладко (Ç, é, ó, some others)
Но эта строка необходима для веб-страницы.

Не знаю что делать = /

2

Решение

Если у вас есть «новый» Delphi (2009+), вы можете выбрать TStringlist для создания своего php-файла.

var
myPhpFile: TStringlist;
begin
myPhpFile := TStringlist.Create;
try
myPhpFile.Add('<(meta http-equiv="Content-Type" content="text/html; charset=utf-8" /)>');
myPhpFile.SaveToFile('myFile.php', TEncoding.UTF8);
finally
myPhpFile.Free;
end;
end;
3

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

Вы пишете файлы, используя Writeln что является наследием ввода / вывода Паскаля. Это не поддерживает Unicode, и вам нужно написать файл, используя другой метод.

Очевидный способ сделать это с классом потоковой записи:

Output := TFileStream.Create(...);
Writer := TStreamWriter.Create(Output, TEncoding.UTF8);
Writer.WriteLine(
'<(meta http-equiv="Content-Type" content="text/html; charset=utf-8" /)>'
);

Параметр кодирования, передаваемый конструктору писателя, гарантирует, что писатель кодирует текст, используя правильную кодировку текста, в данном случае UTF-8.


Как указывает Ян, это создаст спецификацию, которая вам не нужна. Таким образом, вы можете получить класс кодирования, который не излучает спецификацию.

type
TUTF8EncodingWithoutBOM = class(TUTF8Encoding)
public
function GetPreamble: TBytes; override;
end;

function TUTF8EncodingWithoutBOM.GetPreamble: TBytes;
begin
Result := nil;
end;

При инициализации создайте один глобальный экземпляр этого класса и передайте его потоковому модулю записи.

3

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