Hordeからの通知にステップログが含まれており、2バイト文字が表示される場合に文字化けしてしまう

お世話になっております。

5.7.4時点で問題を確認しており、5.8.0でも同様の現象を確認したため報告させていただきます。

前置きとして

既存のNotification実装を拡張し、Teams向けのNotificationを作成・専用にカスタマイズしているため

既存実装での動作確認フローまでは把握できておりません。

また、お恥ずかしながら私自身文字コードに疎い部分がありまして、ここをこうしたら直りました程度の報告となってしまう点、ご了承くださいませ。

◆ 原因となったファイル

5.7.4 : Engine\Source\Programs\Shared\EpicGames.Core\JsonLogEvent.cs

5.8.0 : Engine\Source\Programs\Shared\EpicGames.Core\Logging\JsonLogEvent.cs

◆ メソッド

EpicGames.Core.JsonLogEvent.GetRenderedMessage()

▼ 修正前

return new Utf8String(reader.GetUtf8String().ToArray());

▼ 修正後

string? s = reader.GetString();
return s != null ? new Utf8String(s) : Utf8String.Empty;

Utf8JsonReaderには GetUtf8String()とGetString()があり、

前者はバイト列(未加工/場合によってはエスケープ処理の扱いに差が出る)を返すことがある一方、

GetString()はJSONのエスケープ(\uXXXX 等)を正しく.NET string(UTF-16)へデコードして返しているようです。

現在の実装はバイト列経由でUtf8Stringを作り、後でUtf8String.ToString()(Encoding.UTF8.GetString)でデコードするため、

エスケープの二重扱いやバイト/文字列の取り扱い差で文字化けが発生していそうです。

GetRenderedMessage()でreader.GetString()を使い、得られた.NET stringからUtf8Stringを生成する。

これならJSONの\uXXXXが正しくデコードされ、以後Utf8String.ToString()しても文字化けしない形となりました。

Horde関連で2バイト文字を扱う上では各所で気を付けるべきことがありますが、こちらはかなり根が深いところにあるようです。

Horde Serverだけに適用するのであれば手元コードを修正して、Horde Serverインストーラをビルドするだけで済むのですが

UnrealEngine本体側となると修正した際の影響範囲も大きいように思います。

この点こちらでは確認できておりませんが、ご報告まで。

以上、よろしくお願いいたします。

[Attachment Removed]

お世話になっております。

ご報告と詳細なご調査、ありがとうございます。こちらでも現象を確認いたしました。

原因はGetRenderedMessage()よりもう一段手前、Engine\Source\Programs\Shared\EpicGames.Core\JsonExtensions.csのGetUtf8Bytes()にあるのではないかと考えております。UTF-8の継続バイトは6ビットを保持しますので、マスクは0x3fである必要がありますが、現状は0x1fになっております。同メソッド内に6箇所ございます。

output[1] = (byte)(0b10000000 | ((c >> 6) & 0x1f));

output[2] = (byte)(0b10000000 | (c & 0x1f));

手元では、これが原因で日(U+65E5)が旅(U+65C5)にデコードされることを確認しております。

恐れ入りますが、そちらの環境で0x1fを0x3fに変更したうえで、Teams向けNotificationの表示をご確認いただくことは可能でしょうか。結果をお知らせいただけましたら、正式な修正として問題ないかを一緒に見ていければと考えております。

以上、よろしくお願いいたします。

[Attachment Removed]

承知いたしました。

現在検証している内容があるので、こちらの確認すぐには出来なさそうですが

追って確認できれば返答させていただきます!

[Attachment Removed]

わかりました!

一旦このスレッドをクローズしますが、追加のコメントがあればいつでも再オープンしてください!

​

よろしくお願いします。​

[Attachment Removed]

[mention removed]​

JsonLogEvent.csは手を付けず、UE5.8.1に以下対応を入れて日本語文字化けが回避できたことを確認できました!

​

>​ 原因はGetRenderedMessage()よりもう一段手前、Engine\Source\Programs\Shared\EpicGames.Core\JsonExtensions.csのGetUtf8Bytes()にあるのではないかと考えております。UTF-8の継続バイトは6ビットを保持しますので、マスクは0x3fである必要がありますが、現状は0x1fになっております。同メソッド内に6箇所ございます。

>

> output[1] = (byte)(0b10000000 | ((c >> 6) & 0x1f));

> output[2] = (byte)(0b10000000 | (c & 0x1f));

[Attachment Removed]