4

次のコードは、コードを変更せずに既存の製品の一部の機能を使用できるようにする回避策です。それは私たちにとって良いことですが、なぜこれが機能するのかを理解したいですか? 0x81 文字の特別な点は何ですか?

"A".Equals(Encoding.UTF8.GetString(new byte[] { 0x41, 0x81 }), StringComparison.InvariantCulture) // Returns TRUE

上記のコードは、CurrentCulture と InvariantCulture では機能しますが、Ordinal では機能しません。序数では、上記のコードでは失敗する各バイトが比較されるため、これは理にかなっています。また、デフォルト エンコーディング (SBCS) では機能しません。

4

2 に答える 2

4

バイト シーケンス { 0x41, 0x81 } は有効な UTF-8 ではありません。バイト 0x41 はそれ自体で「A」文字を表し、バイト 0x81 は UTF-8 エンコーディング シーケンスの先頭に出現することはできません。この位置。

Encoding.UTF8.GetString() は例外をスローしないため、 MSDNのフォールバック戦略の選択で説明されているように、文字列に置換文字 (U+FFFD) を追加している可能性があります。

そのため、文字列 "A" を文字列 "A" + 置換文字と比較すると、一部の文字列比較では置換文字が無視され、true が返される場合があります。

于 2013-02-06T06:06:31.700 に答える
-1

カルチャ情報を削除するだけで問題なく動作します。つまり、"A".Equals(Encoding.UTF8. GetString(新しいバイト[] { 0x41, 0x81 }), StringComparison.InvariantCulture)

于 2013-02-06T06:27:10.080 に答える