【发布时间】:2015-09-11 00:49:51
【问题描述】:
我正在尝试使用 Code128A.ttf 字体生成条形码。多年来,我一直在使用 Delphi 的 Windows 2000 和 2003 中使用相同的字体。但是,当我现在尝试在 Windows 8.x 中将字体与 C# 和 .NET 4.5 一起使用时,所有文本字符似乎都可以工作,但是,开始和停止代码字符的呈现方式与 Windows 字符映射显示的不同他们。
例如:在字符映射中,\u008A 在字符映射中显示了一个漂亮的 Code128 停止码条形码字形。然而,当Graphics.DrawString 渲染它时,该字符看起来像Š“带有caron 的拉丁大写S”。同样,Code128 起始代码 \u0087 由 graphics.DrawString 呈现为 ‡“双匕首”,而不是其字符映射条形码字形。
失败的平台 = Windows.Forms、C#、.NET 4.5、Visual Studio 2013、Windows 8.1 最后一个已知的工作平台是 = Delphi 6 (VCL)/Nevrona RAVE, Windows Server 2003
我希望我只是缺少一个设置或一些简单的东西。
void On_PrintPage(object sender, PrintPageEventArgs ppea)
{
string sCodeAStart = "\u0087"; // Code128A.ttf's glyph for Start A 103
string sStopCode = "\u008A"; // Code128A.ttf's glyph for StopCode 106
int iCheckDigit = MyCheckSumFunction(103, "500014630");
string sBarcode = sCodeAStart + "500014630"
+ ((char)iCheckDigit).ToString() + sStopCode;
Font fontBarcode = new Font("Code128A", 24, FontStyle.Regular);
ppea.Graphics.DrawString(sBarcode, fontBarcode, Brushes.Black, 100, 100);
}
应该是这个样子
【问题讨论】:
-
添加了示例代码 sn-p。我试过
ppea.Graphics.TextRenderingHint = TextRenderingHint.SingleBitPerPixel;之类的东西,但它只会改变角色的外观。也许代码页是问题所在。我只是在字符映射中查看字体中字形的索引。我希望 WYSIWYG 像所有其他字体以及它过去的工作方式一样。 -
我通过将“\u008A”字符粘贴到记事本中测试了 Code128A.ttf 字体,效果很好。所以问题肯定出在 .NET 绘图实现中。我为
new Font(,,,)参数尝试了六个byte gdiCharSet值,没有任何变化。该问题可能与代码页设置有关。如何更改 .NET 图形例程的代码页?如何确定哪个代码页将正确呈现我的 Code128A 字体? -
System.Text.Encoding提供了操作代码页和编码/解码字符、字节、字符串等的方法。在测试了几个代码页后,唯一的差异是在 7bit 和 8bit 之间。在 7 位代码页中,开始和停止代码被转换为 7 位并最终成为打印的条形码字符 - 只是不是正确的字符!我认为代码页不是问题;除非我只是不知道哪一个有效。有成千上万的代码页,所以反复试验对我不起作用! -
我发现问题是编码问题。
DrawString("‡...Š", ...)工作!DrawString("\u0087....\u008A", ...)(以及像 \x0087 \u87 \x87 这样的变体)不起作用。我的问题的答案是如何使用 System.Text.Encoding 例程将 (char)135 转换为 "‡"。
标签: c# .net fonts drawstring