はじめに
今回はC#11より実装されたUTF-8文字列リテラルを紹介したいと思います。
// サンプル ReadOnlySpan<byte> span = "Hello"u8; var builder = new StringBuilder(); foreach (var c in span) { builder.Append(c.ToString("x")); builder.Append(", "); } // 出力 : 48, 65, 6c, 6c, 6f, // UTF-16 : 48, 00, 65, 00, 6C, 00, 6C, 00, 6F, 00 // UTF-8 : 48, 65, 6C, 6C, 6F Console.WriteLine(builder.ToString());
概要
string
はUTF-16
が利用されています。
// stringはUTF-16 string str = "Hello"; var builder = new StringBuilder(); foreach (var c in str.AsSpan()) { builder.Append(string.Join(", ", BitConverter.GetBytes(c).Select(x => x.ToString("x")))); builder.Append(", "); } // 出力 : 48, 0, 65, 0, 6c, 0, 6c, 0, 6f, 0 // UTF-16 : 48, 00, 65, 00, 6C, 00, 6C, 00, 6F, 00 // UTF-8 : 48, 65, 6C, 6C, 6F Console.WriteLine(builder.ToString());
UTF-8
の文字列を扱おうと思ったら、現状のC#ですとbyte[]
を利用するということになります。
そこで今回紹介するUTF-8文字列リテラルを用いることで、簡単にUTF-8
のバイト配列を取得することができます。
// "Hoge"u8のように後ろに「u8」をつける ReadOnlySpan<byte> span = "Hello"u8; var builder = new StringBuilder(); foreach (var c in span) { builder.Append(c.ToString("x")); builder.Append(", "); } // 出力 : 48, 65, 6c, 6c, 6f, // UTF-16 : 48, 00, 65, 00, 6C, 00, 6C, 00, 6F, 00 // UTF-8 : 48, 65, 6C, 6C, 6F Console.WriteLine(builder.ToString());
補足
Encoding.UTF8.GetBytes
と同じバイト配列が取得できます。
var bytes = Encoding.UTF8.GetBytes("Hello"); var builder = new StringBuilder(); foreach (var c in bytes) { builder.Append(c.ToString("x")); builder.Append(", "); } // 出力 : 48, 65, 6c, 6c, 6f, // UTF-16 : 48, 00, 65, 00, 6C, 00, 6C, 00, 6F, 00 // UTF-8 : 48, 65, 6C, 6C, 6F Console.WriteLine(builder.ToString());