- Код: Выделить всё
Function ByteType(const S: string; Index: Integer): TMbcsByteType;
begin
Result:=mbSingleByte;
end;
Как видим она всегда возвращает значение однобайтного символа. Т.о. функция из модуля PdfTypes всегда возвращает ложь:
- Код: Выделить всё
function _HasMultiByteString(const Value: string): boolean;
var
i: integer;
begin
result := false;
for i := 1 to Length(Value) do
if ByteType(Value, i) <> mbSingleByte then // Здесь и происходят все неприятности
begin
result := true;
Break;
end;
end;
Т.о. процедура вывода текста на канву обрабатывает русский текст в UTF-8 как однобайтный.
Видится два выхода: или преобразовывать текст из UTF-8 в OEM-866 или CP-1251 (что крайне не приемлемо); или дописать функцию Function ByteType(const S: string; Index: Integer): TMbcsByteType;.
Патчи писать и выкладывать на freepascal.org думаю не стоит, т.к. это очевидный трабл по каким-то причинам не решаемый принципиально разрабами FPC.
От сюда следует вопрос: в новых версиях FPC решена эта проблема или нет?
Добавлено спустя 1 час 27 минут 40 секунд:
Заплатка
- Код: Выделить всё
function _HasMultiByteString(const Value: string): boolean;
var
i: integer;
begin
Result := true;
exit;
//========================================================
result := false;
for i := 1 to Length(Value) do
if ByteType(Value, i) <> mbSingleByte then
begin
result := true;
Break;
end;
end;
Не помогла Теперь выдает вместо набора занков "?" абракадабру... Как победить абракадабру?
Добавлено спустя 25 минут 59 секунд:
Кстати. Ни TPRLabel, ни NPRText во время разработки и во время выполнения не отображают русский текст корректно. Только рисование на TPRImage.Canvas с помощью TextOut выводит текст по русски, но в pdf-файл этот текст не попадает
Добавлено спустя 53 минуты 57 секунд:
Проблемы с отображением русских символов в компоненте связаны с некорректной работой функции:
- Код: Выделить всё
function TPRCustomLabel.InternalTextout(APdfCanvas: TPdfCanvas;
S: string; X, Y: integer): Single;
Внутри нее рассчитывается позиция следующего символа. Так вот функция:
- Код: Выделить всё
function TextWidth(Text: string): Single;
всегда возвращает нуль в случае кириллицы. Связано это с тем, что разработчик использовал свою функцию перекодировки UTF8 в Ansi:
- Код: Выделить всё
function _UTF8ToWinAnsi(const value:string; InvalidChar:char='?'): string;
которая, в принципе, перекодировать не умеет. Пришлось заменить ее на:
- Код: Выделить всё
function UTF8ToCP1251(const s: string): string;
Вывод: использовать PowerPDF - не возможно, лечить его - долгий процесс.
P.S. Посему жду предложений на тему: "Как экспортировать отчет в PDF?"
Добавлено спустя 23 минуты 20 секунд:
Как и ожидалось - из LazReport экспортируется в PDF кракозябриками