C# で文字列からバイトオーダーマークを削除する 質問する

C# で文字列からバイトオーダーマークを削除する 質問する

C# では、WebClient.DownloadString から取得する文字列があります。client.Encoding を new UTF8Encoding(false) に設定してみましたが、違いはありませんでした。結果の文字列の先頭に UTF-8 のバイト オーダー マークが付きます。これを削除する必要があり (結果の XML を LINQ で解析するため)、メモリ内で削除したいと考えています。

\x00EF\x00BB\x00BFで始まる文字列があり、それが存在する場合は削除したいのですが、現在使用しているのは

if (xml.StartsWith(ByteOrderMarkUtf8))
{
    xml = xml.Remove(0, ByteOrderMarkUtf8.Length);
}

しかし、それは間違っているように感じます。ストリーム、GetBytes、エンコードを使用してあらゆる種類のコードを試しましたが、何も機能しません。文字列から BOM を取り除く「正しい」アルゴリズムを提供してくれる人はいますか?

ベストアンサー1

最近、.NET 4のアップグレードで問題が発生しましたが、それまでは簡単な答えは次のとおりです。

String.Trim()

.NET 3.5 までは BOM を削除します。

ただし、.NET 4 では少し変更する必要があります。

String.Trim(new char[]{'\uFEFF'});

これにより、バイトオーダーマークも削除されますが、ゼロ幅スペース(U+200B):

String.Trim(new char[]{'\uFEFF','\u200B'});

これを使用して、他の不要な文字を削除することもできます。

さらに詳しい情報はString.Trim メソッド:

.NET Framework 3.5 SP1 およびそれ以前のバージョンでは、このメソッドがトリミングする空白文字の内部リストが保持されています。.NET Framework 4 以降では、このメソッドはすべての Unicode 空白文字 (つまり、Char.IsWhiteSpace メソッドに渡されたときに true の戻り値を生成する文字) をトリミングします。この変更により、.NET Framework 3.5 SP1 およびそれ以前のバージョンの Trim メソッドは、.NET Framework 4 およびそれ以降のバージョンの Trim メソッドが削除しない 2 つの文字、ゼロ幅スペース (U+200B) とゼロ幅ノーブレーク スペース (U+FEFF) を削除します。さらに、.NET Framework 3.5 SP1 以前のバージョンの Trim メソッドでは、3 つの Unicode 空白文字 (モンゴル語の​​母音区切り文字 (U+180E)、狭い改行なしスペース (U+202F)、および中程度の数学的スペース (U+205F)) がトリミングされません。

おすすめ記事