2015-10-27 3 views
0

У меня возникли проблемы с печатью специальных символов (€, £, ¥, ý) на термопринтере EPSON TM-T88V по командам esc/pos. Вот часть коды:Распечатка специальных символов на термопринтере

FPrintoutLines := TStringList.Create; 
try 
    FPrintoutLines.Add(#$1B'@'); 
    FPrintoutLines.Add(#$1B't'#16); 
    FPrintoutLines.Add('€, £, ¥, ý'+#$A); 
    Print 
finally 
    FPrintoutLines.Free; 
end; 

В Windows XP у меня есть правильная распечатка со всеми символами, проблема с Windows 7 и 8.

Я строем StringList с командами, а затем отправить эту строку за строкой к принтеру. Это прекрасно работает для всех других символов и изображений, но не для специальных символов.

Может ли кто-нибудь мне помочь, как я могу печатать эти символы из любой Windows?

Вот код, который печатает строку:

var 
    vCurrentLine : AnsiString; 
begin 
... 
for i := 0 to FPrintoutLines.Count - 1 do begin 
    vCurrentLine := AnsiString(FPrintoutLines[i]); 

    if (PrintRawData(hPrn, PAnsiChar(vCurrentLine), Length(vCurrentLine)) < 0) then begin 
    log('PrintRawData error', 'NativePrint'); 
    EndRawPrintPage(hPrn); 
    EndRawPrintJob(hPrn); 
    Exit; 
    end; 

конца;

+0

Нам нужно угадать, что делает «Печать». Мы также не знаем спецификации команд принтера. Вы проверили, что вы отправляете на принтер, когда считаете его двоичным? Я бы предположил, что вы просто наивно переходите от UTF-16 к локальному ANSI, и беспорядок начинается там. Знаете ли вы, какое двоичное значение вы должны отправлять для этих символов? –

+0

Я добавил код, как отправлять строки на принтер. Нет, я не знаю, и я не могу это проверить. Я понимаю, что проблема в разных кодовых страницах в окнах xp и 7,8. Не могли бы вы рассказать, как я могу построить более универсальную строку? Прежде чем отправлять строки на принтер, я конвертирую его как AnsiString (FPrintoutLines [i]), потому что без него у меня есть совершенно неверная распечатка. –

+0

So. Какие бинарные значения вам нужно передать на принтер? Либо мы читаем руководство, либо вы это делаете. Угадайте, что мы предпочитаем. –

ответ

0

Я нашел путь. Вот функция для преобразования строки перед отправкой ее на принтер. Теперь он корректно работает на всех Windows

function TNativePrint.WideStringToString(const AStr : UnicodeString; vCodePage : Word) : AnsiString; 
var 
    vLen: Integer; 
begin 
    vLen := Length(AStr); 

    if (vLen = 0) then begin 
    result := ''; 
    exit; 
    end; 

    SetAnsiString(@result, @AStr[1], vLen, vCodePage); 
end; 
+1

Я бы не рекомендовал это. Намного лучше использовать «TEncoding.GetBytes» и экземпляр «TEncoding» для соответствия любой кодовой странице, требуемой принтером. –

+0

Причина в том, что слишком легко случайно выполнить преобразования кодовой страницы при работе с AnsiString с Unicode Delphi. –