首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >"Beta:使用Unicode UTF-8进行世界范围的语言支持“实际上做了什么?

"Beta:使用Unicode UTF-8进行世界范围的语言支持“实际上做了什么?
EN

Stack Overflow用户
提问于 2019-06-02 23:11:11
回答 4查看 32K关注 0票数 37

在一些Windows 10版本中(内部人士从2018年4月开始,也是“正常的”1903年),有一个新的选项叫做"Beta:使用Unicode UTF-8进行世界范围的语言支持“。

您可以通过转到“设置”,然后:“所有设置”、“->时间和语言->语言”->“管理语言设置”来查看此选项。

看上去是这样的:

当选中此复选框时,我观察到一些不正常的地方(下面)和,我想知道这个复选框到底做了什么,以及为什么会发生

在Visual 2019中创建全新的Windows窗体应用程序。在主表单上,指定Paint偶数处理程序如下:

代码语言:javascript
运行
复制
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);
}

运行程序,如果没有选中复选框,下面是您将看到的内容:

但是,如果选中复选框(并按要求重新启动),则此操作将更改为:

您可以在维基百科上查找韦伯丁字体。根据给出的字符表,这两个字符的代码为"\U0001F5D5\U0001F5D9"。如果我使用它们而不是"0r",它可以与选中的复选框一起工作,但是如果不选中复选框,它现在看起来如下所示:

我希望找到一个始终有效的解决方案,无论复选框还是未选中框。

这能办到吗?

EN

回答 4

Stack Overflow用户

发布于 2019-08-03 20:27:52

你可以在ProcMon上看到它。它似乎将REG_SZACPMACCPHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage中的OEMCP设置为65001

我不完全确定,但可能与KernelBase.dll中的变量gAnsiCodePage相关,GetACP是这样读的。如果您真的愿意,您可以通过动态解压缩GetACP来查找读取gAnsiCodePage的指令序列并获得指向它的指针,然后直接更新变量,从而可以对程序进行动态更改,而不管系统设置如何。

(实际上,我SetCPGlobal本来可以完成这项工作,但在我的系统中找不到这个功能。不确定它是否仍然存在。)

票数 15
EN

Stack Overflow用户

发布于 2020-04-08 18:29:28

大多数Windows C API有两种不同的变体:

  • "A“变体,使用8位字符串与任何系统配置的编码是。这取决于配置的国家/语言。(Microsoft将配置的编码称为"ANSI代码页“,但实际上与ANSI无关)。
  • "W“变体,在固定的UTF-16编码中使用16位字符串。(“几乎”是因为“未配对的代孕者”是允许的;如果你不知道这些是什么,那就不用担心它们)。

微软的官方建议不是使用"A“版本,而是确保代码始终使用"W”变体。这样,不管用户的国家/语言配置为什么,您都应该得到一致的行为。

然而,看起来这个复选框做的不仅仅是一件事。很明显,它应该将"ANSI代码页“更改为65001,这意味着UTF-8。看起来,它也在改变字体呈现方式,使之更加统一。

我建议您检测GetACP() == 65001,然后绘制您的字符串的Unicode版本,否则将绘制旧的"0r“版本。我不知道你是怎么做到的,.NET.

票数 6
EN

Stack Overflow用户

发布于 2021-06-21 10:08:22

请看这个问题,看看它在启用时解决了什么:如何在Powershell中保存程序的非ascii输出文件?

我还发现了古斯勒写的解释很有帮助(来源):

如果您选中此选项,Windows将对所有纯文本文件使用代码页65001 (Unicode UTF-8),而不使用本地代码页(如1252 (Western Latin1) )。其优点是,在例如俄文地区创建的文本文件也可以在西欧或中欧等其他地区读取。缺点是,仅使用ANSI的程序(大多数旧程序)将显示垃圾而不是重音字符。

我在这里提出了两种启用它的方法,我认为它们对许多用户都有帮助:

  1. Win+R -> intl.cpl
  2. Administrative标签
  3. 单击Change system locale按钮。
  4. 启用Beta: Use Unicode UTF-8 for worldwide language support
  5. 重新启动

或者通过reg文件:

代码语言:javascript
运行
复制
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage]
"ACP"="65001"
"OEMCP"="65001"
"MACCP"="65001"
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56419639

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档