Delphi 7土耳其语印刷

时间:2016-08-23 08:53:03

标签: delphi printing delphi-7 turkish

我有一些用Delphi 7 Pascal编写的遗留代码(100万行),由于各种原因无法升级到更新版本的Delphi。该计划以大约30种语言输出文件,并且除了土耳其语之外,还能很好地制作各种语言的各种人物。编码将字符集设置为TURKISH_CHARSET(162)。当它试图打印char#351(ş,hex 15f),char#285(ğ,hex 11f)或char#305(ı,hex 131)时,它只打印“s”,“g”或“i”。它使用简单的

Printer.Canvas.TextOut(x, y, sText)  

输出文字。

我尝试在不同的机器上编译代码并在不同版本的Windows上运行它,但总是有相同的结果。

1 个答案:

答案 0 :(得分:0)

在Delphi 7中,stringAnsiString的别名,它使用Windows代码页将Unicode字符编码为8位字节。在某些MBCS代码页中,Unicode字符可能需要多个字节(但土耳其语不是其中之一)。

Microsoft为土耳其语提供了几个代码页:

  • 857(MS-DOS)
  • 1254(Windows)
  • 10081(Macintosh)
  • 28599(ISO-8859-9)

在代码页1254和28599(其中1254是您最常遇到的代码)中,所讨论的Unicode字符以8位编码为十六进制$FEş),{ {1}}($F0)和ğ$FD)。

确保您的ı字符串变量实际上包含那些字节值,而不是ASCII字节sText$73),s$67 )和g$69)代替。如果它包含后者,那么您在土耳其数据达到i之前就会丢失它。这将是您的代码中较早出现的问题。

但是,如果Canvas.TextOut()包含正确的字节,那么问题必须在操作系统端,因为sText只是Win32 API ExtTextOutA()函数的一个瘦包装器,其中TCanvas.TextOut()按原样传递给API。也许您使用的特定字体不支持土耳其语,或至少支持那些特定字符。或者打印机驱动程序可能存在问题。无论哪种方式,您可能不得不求助于使用MultiByteToWideChar()sText值转换为sText,然后直接致电WideString(而不是ExtTextOutW()),例如:

ExtTextOutA()