C#:检查字体中不支持的字符/字形 [英] C#: Check for unsupported characters/glyphs in a font
问题描述
我正在开发一个翻译软件插件(C#、.NET 2.0),它在模拟设备显示器中显示翻译的文本.我必须检查是否可以使用指定的字体 (Windows TTF) 显示所有翻译文本.但是我没有找到任何方法来检查字体是否有不受支持的字形.有人有想法吗?
I am working on a translation software add in (C#, .NET 2.0) which displays translated texts in a emulated device display. I have to check if all translated texts could be displayed with specified fonts (Windows TTF). But I didn't found any way to check a font for unsupported glyphs. Does anyone have an idea?
谢谢
推荐答案
您是否仅限于 .NET 2.0?在 .NET 3.0 或更高版本中,有 GlyphTypeface
类,它可以加载字体文件并公开 CharacterToGlyphMap
属性,我相信它可以满足您的需求.
Are you limited to .NET 2.0? In .NET 3.0 or higher, there's the GlyphTypeface
class, which can load a font file and exposes the CharacterToGlyphMap
property, which I believe can do what you want.
在 .NET 2.0 中,我认为您将不得不依赖 PInvoke.尝试类似:
In .NET 2.0, I think you'll have to rely on PInvoke. Try something like:
using System.Drawing;
using System.Runtime.InteropServices;
[DllImport("gdi32.dll", EntryPoint = "GetGlyphIndicesW")]
private static extern uint GetGlyphIndices([In] IntPtr hdc, [In] [MarshalAs(UnmanagedType.LPTStr)] string lpsz, int c, [Out] ushort[] pgi, uint fl);
[DllImport("gdi32.dll")]
private static extern IntPtr SelectObject(IntPtr hdc, IntPtr hgdiobj);
private const uint GGI_MARK_NONEXISTING_GLYPHS = 0x01;
// Create a dummy Graphics object to establish a device context
private Graphics _graphics = Graphics.FromImage(new Bitmap(1, 1));
public bool DoesGlyphExist(char c, Font font)
{
// Get a device context from the dummy Graphics
IntPtr hdc = _graphics.GetHdc();
ushort[] glyphIndices;
try {
IntPtr hfont = font.ToHfont();
// Load the font into the device context
SelectObject(hdc, hfont);
string testString = new string(c, 1);
glyphIndices = new ushort[testString.Length];
GetGlyphIndices(hdc, testString, testString.Length, glyphIndices, GGI_MARK_NONEXISTING_GLYPHS);
} finally {
// Clean up our mess
_graphics.ReleaseHdc(hdc);
}
// 0xffff is the value returned for a missing glyph
return (glyphIndices[0] != 0xffff);
}
private void Test()
{
Font f = new Font("Courier New", 10);
// Glyph for A is found -- returns true
System.Diagnostics.Debug.WriteLine(DoesGlyphExist('A', f).ToString());
// Glyph for ಠ is not found -- returns false
System.Diagnostics.Debug.WriteLine(DoesGlyphExist((char) 0xca0, f).ToString());
}
这篇关于C#:检查字体中不支持的字符/字形的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!