【发布时间】:2019-06-02 23:11:11
【问题描述】:
在某些 Windows 10 版本(从 2018 年 4 月开始的内部人员以及“正常”1903 年)中,有一个名为“测试版:使用 Unicode UTF-8 获得全球语言支持”的新选项。
您可以通过转到设置来查看此选项,然后: 所有设置 -> 时间和语言 -> 语言 -> “管理语言设置”
这就是它的样子:
选中此复选框时,我观察到一些异常情况(如下),我想知道此复选框的具体作用以及为什么会发生以下情况。
在您的 Visual Studio 2019 中创建一个全新的 Windows 窗体应用程序。在主窗体上指定 Paint 偶数处理程序,如下所示:
private void Form1_Paint(object sender, PaintEventArgs e)
{
Font buttonFont = new Font("Webdings", 9.25f);
TextRenderer.DrawText(e.Graphics, "0r", buttonFont, new Point(), Color.Black);
}
运行程序,如果未选中复选框,您将看到以下内容:
但是,如果您选中复选框(并按要求重新启动),则会更改为:
您可以在维基百科上查找Webdings 字体。根据给出的字符表,这两个字符的代码是"\U0001F5D5\U0001F5D9"。如果我使用它们而不是 "0r" 它可以工作 with 选中的复选框但 没有 选中的复选框现在看起来像这样:
我想找到一个始终有效的解决方案,无论复选框是否选中。
这个可以吗?
【问题讨论】:
-
系统区域设置决定了 ANSI 和 OEM 代码页。该复选框强制它们使用 UTF-8(代码页 65001)。显然,这有一个次要影响,导致
DrawText不使用所选字体呈现“0r”。我猜这是因为 Webdings 和 Wingding 等符号字体在字体的 OS/2 表中没有声明任何 Unicode 范围或旧代码页。相反,它们将代码映射到任意字形。继续猜测,如果您选择常规字体,"\U0001F5D5\U0001F5D9"可能会起作用。显然字体后备可以找到所需的字体。 -
除了前两句话,我只是猜测。你比我更接近问题及其解决方案。如果您不介意,我希望您自己回答。
-
你的源代码是什么编码的?更改 Windows 设置将更改 CP_ACP,这将更改文本文件中没有显式编码(通过 BOM)的字符的解释。您的来源似乎包含扩展字符。在源代码中,我建议在字符串文字中对任何非 ASCII 字符使用 unicode 转义码,否则您将取决于环境设置,这些设置可能会有所不同(在这种情况下会有所不同)。
-
@PaulDempsey 复制它的所有信息都在问题中给出。没有进行 OP 中未提及的特殊编码更改。此外,我的源代码似乎不包含字符串文字中的 unicode 转义码以外的扩展字符,这些字符在 OP 中被标记为这样。
标签: c# .net windows winforms windows-10