27

更新された質問¹

文字クラス、比較、並べ替え、正規化、および照合に関して、どの .NET プラットフォームでどの Unicode バージョンがサポートされていますか?

元の質問

.NET が Unicode バージョン 3.0 をサポートしていること、および内部の UTF-16 エンコーディングが実際には UTF-16 ではなく、実際には UCS-2 を使用していることを漠然と読んだことを覚えています。これは同じではありません。たとえば、U+FFFF を超える文字は使用できないようです。つまり、次のように考えてください。

string s = "\u1D7D9"; // ("Mathematical double-struck digit one") 

そして、文字列を格納します"ᵽ9"

私は基本的に、次の回答の決定的な参照を探しています。

  • .NET の真の UTF-16 でない場合、それは何ですか?
  • .NET でサポートされている Unicode のバージョンは何ですか?
  • 最近のバージョンがサポートされていないか、近い将来に計画されていない場合、誰かが (非) 商用ライブラリを知っていますか、またはこの問題を回避する方法を教えてください。

¹)時間の経過とともに質問を更新しました。回答とより大きなコミュニティに関しては、より適切なようです。コメントで回答された部分の代わりに、元の質問を残しました。また、古い UCS-2 (サロゲートなし) は現在の古い 32 ビット Windows バージョンで使用され、.NET は常に内部で UTF-16 (サロゲートあり) を使用してきました。

4

4 に答える 4

19

内部的には、.NET は UTF-16 です。ASP.NET が応答に書き込む場合など、場合によっては、デフォルトで UTF-8 が使用されます。どちらもより高い平面を処理できます。

人々が .NET を UCS2 と呼ぶことがある理由は (他に理由がほとんどないためだと思います)、Char は厳密に 16 ビットであり、単一の Char を使用して上位プレーンを表すことができないためです。ただし、Char には、Char.IsLetter文字列内の高平面 UTF-16 文字を操作できる静的メソッド オーバーロード (例: ) があります。文字列は真の UTF-16 として保存されます。

大文字を使用して上位の Unicode コードポイントを直接アドレス指定できます\U(例: "\U0001D7D9"- ただし、文字ではなく文字列内のみ)。

Unicode バージョンについては、MSDN のドキュメントから:

「.NET Framework 4 では、並べ替え、大文字と小文字の区別、正規化、および Unicode 文字情報が Windows 7 と同期され、Unicode 5.1 標準に準拠しています。」

更新 1:ただし、 Windows 7 でも .NET 4.0 でも、Unicode 5.1全体がサポートされているわけではないことに注意してください。

Windows 8 は Unicode 6.0 をターゲットにしています - .NET Framework 4.5 はそれと同期するかもしれないと推測していますが、それを確認するソースは見つかりませんでした。繰り返しますが、これは標準全体が実装されているという意味ではありません。

更新 2: Roslyn に関するこのメモは、基になるプラットフォームがコンパイラの Unicode サポートを定義していることを確認し、コードへのリンクで、C# 6.0 が Unicode 6.0 以降をサポートしていることを説明しています (結果として C# 識別子の重大な変更があります)。

更新 3: .NET バージョン 4.5 以降、静的プロパティを呼び出して、サポートされている Unicode バージョンを取得する新しいクラスSortVersionSortVersion.FullVersionが導入されました。同じページで、Microsoft は、.NET 4.0 がすべてのプラットフォームで Unicode 5.0 をサポートし、.NET 4.5 が Windows 7 で Unicode 5.0 をサポートし、Windows 8で Unicode 6.0 をサポートしていると説明していますそれぞれバージョン 5.x および 6.0。私自身 (編集者: Abel) の経験から、ほとんどの場合、.NET 4.0 では少なくとも文字クラスに対して Unicode 5.1 がサポートされているようですが、並べ替え、正規化、および照合はテストしていません。これは、上記のMSDNで述べられていることと一致しているようです。

于 2012-02-06T15:49:51.010 に答える
5

そのキャラクターはサポートされています。注意すべきことの 1 つは、2 バイトを超える Unicode 文字の場合、次のように大文字の '\U' で宣言する必要があることです。

string text = "\U0001D7D9"

テキスト ブロックでその文字を使用して WPF アプリを作成すると、ダブル 1 文字が完全にレンダリングされます。

于 2012-02-06T15:42:12.593 に答える
4

MSDN では、ここで簡単に説明しています: http://msdn.microsoft.com/en-us/library/9b1s4yhz(v=vs.90).aspx

私はこれを試しました:

    static void Main(string[] args) {
        string someText = char.ConvertFromUtf32(0x1D7D9);
        using (var stream = new MemoryStream()) {
            using (var writer = new StreamWriter(stream, Encoding.UTF32)) {
                writer.Write(someText);
                writer.Flush();
            }
            var bytes = stream.ToArray();
            foreach (var oneByte in bytes) {
                Console.WriteLine(oneByte.ToString("x"));
            }
        }
    }

これらのエンコーディングについて、正しい BOM と\u1D7D9コードポイントの正しい表現を含むバイト配列のダンプを取得しました。

  • UTF8
  • UTF32
  • ユニコード(UTF-16)

だから私の推測では、より高いプレーンがサポートされており、UTF-16 は実際には UTF-16 (UCS-2 ではない)です。

于 2012-02-06T15:36:17.340 に答える
0

.NET Framework 4.6 および 4.5 および 4 および 3.5 および 3.0 - Unicode 標準、バージョン 5.0 .NET Framework 2.0 および 1.1 - Unicode 標準、バージョン 3.1

完全な回答は、ここの「備考」セクションの下にあります。

于 2015-05-12T15:15:30.903 に答える