はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【C#】C#11より実装されたUTF-8文字列リテラルを用いてUTF-8のbyte配列を生成する

はじめに

今回は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());

learn.microsoft.com

概要

stringUTF-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());