.NETでは、Encoding.UTF8.GetString
メソッドを使用しようとしています。これはバイト配列をとり、string
に変換します。Encoding.UTF8.GetStringはプリアンブル/ BOMを考慮していません
このメソッドは、BOM (Byte Order Mark)(UTF8文字列の正当なバイナリ表現の一部である可能性があります)を無視し、文字として扱います。
私はTextReader
を使用して必要に応じてBOMをダイジェストすることができますが、私はGetStringメソッドをコードを短くする種類のマクロにする必要があると考えました。
何か不足していますか?これはそんなに意図的ですか?ここで
は、再生コードです:
static void Main(string[] args)
{
string s1 = "abc";
byte[] abcWithBom;
using (var ms = new MemoryStream())
using (var sw = new StreamWriter(ms, new UTF8Encoding(true)))
{
sw.Write(s1);
sw.Flush();
abcWithBom = ms.ToArray();
Console.WriteLine(FormatArray(abcWithBom)); // ef, bb, bf, 61, 62, 63
}
byte[] abcWithoutBom;
using (var ms = new MemoryStream())
using (var sw = new StreamWriter(ms, new UTF8Encoding(false)))
{
sw.Write(s1);
sw.Flush();
abcWithoutBom = ms.ToArray();
Console.WriteLine(FormatArray(abcWithoutBom)); // 61, 62, 63
}
var restore1 = Encoding.UTF8.GetString(abcWithoutBom);
Console.WriteLine(restore1.Length); // 3
Console.WriteLine(restore1); // abc
var restore2 = Encoding.UTF8.GetString(abcWithBom);
Console.WriteLine(restore2.Length); // 4 (!)
Console.WriteLine(restore2); // ?abc
}
private static string FormatArray(byte[] bytes1)
{
return string.Join(", ", from b in bytes1 select b.ToString("x"));
}
私が参照してください。解明してくれてありがとう! –
@RonKleinまた、先頭のBOM文字を削除するには、 'restore2 = restore2.TrimStart( '\ uFEFF')'と言うことができます。 GetBytes( "abc") 'と'(新しいUTF8Encoding(false)).GetBytes( "abc") 'は同じ出力を生成しますが、おそらくあなたは同じ出力を生成します。今知っている 'GetBytes'はあなたがファイルの先頭にいるとは想定していないので、' GetPreamble'を使うことはありません。 'GetBytes'や' GetString'を使うと、 'GetPreamble'を明示的に、またはプリアンブルを明示的にスキップする必要があります。 –