我有一些用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上运行它,但总是有相同的结果。
答案 0 :(得分:0)
在Delphi 7中,string
是AnsiString
的别名,它使用Windows代码页将Unicode字符编码为8位字节。在某些MBCS代码页中,Unicode字符可能需要多个字节(但土耳其语不是其中之一)。
Microsoft为土耳其语提供了几个代码页:
在代码页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()