(2021/01/18追記)全角カタカナと半角カタカナを同じ文字として区別せずに比較する機能がWindows 10 バージョン 2004 / 20H2で挙動が変わった

# 概要

- WindowsのOSとして用意されている機能として、全角カタカナと半角カタカナ（例えば`ガ`と`ｶﾞ`）を同じ文字として**区別せずに判定する機能**があります。

    しかし、Windows 10 バージョン 2004 / 20H2でOS の自然言語処理を担う NLS (National Language Support) バージョンが更新 (6.3) され、この機能を使用しても別の文字として判定されるように**挙動が変わり**ました。

    全角カタカナと半角カタカナの**【区別をしない】**機能で`ガ`と`ｶﾞ`を比較
    
    |OS|比較結果|
    |---|---|
    |～1909|同一である|
    |2004/20H2|同一ではない|

- 以下の製品などに影響があるようですが、影響は限定的と思われます。
    - Access
    - Excel
    - .NET(Visual Basic/C#)
    - VB6

    
- 根本的な対応時期は、以下となるようです。詳細は引用元をご参照ください。

    > つまり、既にリリース済のバージョン 2004 および 20H2 において既存のバージョンのまま問題を回避することは機能仕様上出来ず、2021年以降の Windows 10 OS にて本問題を修正したバージョンがリリースされます。

    > これらのことから、バージョン 2004 および 20H2 においては、利用者様にて問題が発生しないように対応をしていただく必要があります。

    引用元：[Windows 10 バージョン 2004 (20H1) / 20H2 上で 半角カナのフォームを含んだ Access ファイルでエラーが発生する](https://social.msdn.microsoft.com/Forums/ja-JP/4e6223e2-34d0-4a5f-bb61-109bc28040b6/windows-10-1249612540124721251912531-2004-20h1-20h2-1997812391?forum=officesupportteamja)

# 履歴

- **(2020/12/02)** より詳細な検証記事がこちらにありました！
  - https://qiita.com/yaju/items/2df7114da828e45fceac

- **(2021/01/18)** Oracleのフィールド名で半角カタカナ（`ｺｰﾄﾞ`、`ﾃﾞｰﾀ`など）を使用した場合に、Windows 10 バージョン 2004 以降でフィールド名を認識しない（`要求された名前または序数に対するコレクションが見つかりません`というエラーが発生）という事例がありました。

- **(2021/01/21)** 2020/12/9に[公式ドキュメント](https://support.microsoft.com/en-us/help/4581839/windows-10-update-history)で暫定対応策が追記されましたが、「複数システム間の影響」を考慮すると適用できる事例は限定されそうです。

# 影響

確認・調査した限りの影響を記載します。

## Access

- [Windows 10 バージョン 2004 (20H1) / 20H2 上で 半角カナのフォームを含んだ Access ファイルでエラーが発生する](https://social.msdn.microsoft.com/Forums/ja-JP/4e6223e2-34d0-4a5f-bb61-109bc28040b6/windows-10-1249612540124721251912531-2004-20h1-20h2-1997812391?forum=officesupportteamja)

    💡 対応時期、暫定の対処方法が上記ページに記載されています。

- [DoCmd.OpenForm メソッド](https://docs.microsoft.com/ja-jp/office/vba/api/access.docmd.openform)で、濁点を含んだの全角カタカナフォーム名に対して、半角フォーム名文字列指定していた場合にエラーが発生するようになった。

    💡 既存コードに問題がある場合です（実際のフォーム名と全角半角の相違がある）

- `Option Compare Database`、または`Option Compare Text`を指定して`ガ`と`ｶﾞ`を=演算子で比較すると、結果が異なる（StrCompなども）

    ⚡ Access VBAの既定値は`Option Compare Database`のため、比較的影響は大きいかもしれません。

## Excel

- Windows 10 Pro 2004、Office 365（16.0.12527.21924）の環境で、濁点を含んだ全角カタカナと半角カタカナで同じシート名を設定できました。

    このファイルをWindows 10 Pro 1909、Office 365（16.0.13328.20262）の環境で開くことはできました。ただし、シートをリネームして再び確定すると名前が同一であるという旨のエラーが表示されました。

- `Option Compare Text`を指定して`ガ`と`ｶﾞ`を=演算子で比較すると、結果が異なります（StrCompなども）。
　　
    💡 Excel VBAの既定値は`Option Compare Binary`のため、影響は限定的と思われます。

## .NET(Visual Basic/C#)

.NET Framework 3.5、4.7.2で調査しました。.NET Coreは調査できていません。

10 Pro 2004、.NET Framework 4.7.2で、`CompareInfo.Compare(,,CompareOptions.IgnoreWidth)`、またはVisual Basicで`Option Compare Text`を指定して=演算子で比較すると、挙動が変わっていました。

|OS|.NET Framworkのバージョン|`ガ`と`ｶﾞ`を同一としてみなす機能で比較した際の結果|
|---|---|---|
|10 Pro 1909|3.5|同一と判定される|
|10 Pro 1909|4.7.2|同一と判定される|
|10 Pro 2004|3.5|同一と判定される|
|10 Pro 2004|4.7.2|同一と判定されない　※挙動が変わっている|


### `CompareInfo.Compare(,,CompareOptions.IgnoreWidth)`

💡 Visual Basicのコードは省略します。

```csharp
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace sample
{
    class Program
    {
        static void Main(string[] args)
        {
            System.Globalization.CompareInfo ci = System.Globalization.CultureInfo.CurrentCulture.CompareInfo;
            var result = (ci.Compare("ガ", "ｶﾞ", System.Globalization.CompareOptions.IgnoreWidth) == 0);
            Console.WriteLine($@"{result}");
        }

    }
}
```

### `Option Compare Text`を指定して=演算子で比較

💡 Visual Basicの既定値は`Option Compare Binary`のため、影響は限定的と思われます。

```vb
Option Compare Text

Sub Main()
    Dim result = ("ガ" = "ｶﾞ")
    Console.WriteLine($"{result}")
End Sub
```

## VB6

実際に調査できていませんが、VB6の既定値は`Option Compare Binary`のため、影響は限定的と思われます。