web-dev-qa-db-ja.com

「ベータ版:世界的な言語サポートにUnicode UTF-8を使用する」は実際に何をしますか?

一部のWindows 10ビルド(2018年4月以降のインサイダーおよび「通常」1903)には、「ベータ版:世界的な言語サポートにUnicode UTF-8を使用する」という新しいオプションがあります。

このオプションを表示するには、[設定]に移動し、[すべての設定]-> [時間と言語]-> [言語]-> [管理言語設定]を選択します。

これは次のようになります。

enter image description here

このチェックボックスをオンにすると、以下の不規則性が観察されますこのチェックボックスの機能と以下の理由を知りたい

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);
}

プログラムを実行します。チェックボックスがオフの場合は次のようになります。

enter image description here

ただし、チェックボックスをオンにすると(要求されたとおりに再起動すると)、次のように変わります。

enter image description here

ウィキペディアで Webdings フォントを検索できます。指定された文字テーブルによると、これらの2つの文字のコードは"\U0001F5D5\U0001F5D9"です。 "0r"の代わりにそれらを使用すると、チェックボックスがチェックされていると機能しますが、チェックボックスがチェックされていないなしようになりましたこの:

enter image description here

alwaysが機能し、ボックスがチェックされているかどうかに関係なく機能する解決策を見つけたいと思います。

これはできますか?

12
Andrew Savinykh

ほとんどのWindows C APIには、2つの異なるバリアントがあります。

  • システム構成エンコーディングが何であれ、8ビット文字列を使用する "A"バリアント。これは、構成された国/言語によって異なります。 (Microsoftは、構成されたエンコードを「ANSIコードページ」と呼んでいますが、ANSIとはまったく関係ありません)。
  • ほぼUTF-16の固定エンコーディングで16ビット文字列を使用する「W」バリアント。 (「ほぼ」は、「ペアになっていない代理」が許可されているためです。これらが何であるかがわからない場合は、心配する必要はありません)。

Microsoftの公式なアドバイスは、「A」バージョンを使用することではなく、コードが常に「W」バリアントを使用するようにすることです。そうすれば、ユーザーの国/言語がどのように構成されていても、一貫した動作が得られるはずです。

ただし、そのチェックボックスは複数のことを実行しているようです。 「ANSIコードページ」を65001に変更する必要があることは明らかです。これはUTF-8を意味します。フォントのレンダリングもよりユニコディに変化しているようです。

GetACP() == 65001 であるかどうかを検出してから、Unicodeバージョンの文字列を描画します。それ以外の場合は、古い「0r」バージョンを描画します。 .NETからそれを行う方法はわかりません...

1
user9876