feat: 项目初始化 + 3D方块世界原型 + AI助搭系统
CI / Go Backend (push) Canceled after 0s

初始化 monorepo: Go后端(7微服务) + Unity客户端(9模块) + 启动器

HTML5原型: Three.js 3D体素世界, Perlin噪声地形, 原版材质, 22种方块

Minecraft创造模式背包: 双栏布局, 拖拽移动物品, 方向性元件引脚

AI助搭策划文档 + 客户端/服务端骨架 + Docker Compose + CI
This commit is contained in:
xyou
2026-08-08 14:07:56 +08:00
parent 9500c4c80a
commit f70b061d1a
1972 changed files with 159760 additions and 6 deletions
@@ -0,0 +1,51 @@
namespace PCL.Core.Utils.Codecs;
using System;
using System.Text;
public static class EncodingUtils {
public static bool IsDefaultEncodingUtf8() => Encoding.Default.CodePage == 65001;
public static bool IsDefaultEncodingGbk() => Encoding.Default.CodePage == 936;
/// <summary>
/// 解码字节数组为字符串,自动检测 BOMUTF-8、UTF-16 LE/BE、UTF-32 LE/BE)或回退到 GB18030。
/// </summary>
/// <param name="bytes">要解码的字节数组。</param>
/// <returns>解码后的字符串,失败时返回空字符串。</returns>
public static string DecodeBytes(byte[] bytes) {
if (bytes.Length == 0) return "";
// 使用 EncodingDetector 检测编码
var encoding = EncodingDetector.DetectEncoding(bytes);
// 如果检测到有效编码(非 Encoding.Default),直接解码
if (!encoding.Equals(Encoding.Default)) {
ReadOnlySpan<byte> span = bytes.AsSpan();
if (encoding.Equals(Encoding.UTF8) && span.Length >= 3 && span[0] == 0xEF && span[1] == 0xBB && span[2] == 0xBF) {
return encoding.GetString(span[3..]); // 跳过 UTF-8 BOM
}
if (encoding.Equals(Encoding.BigEndianUnicode) && span.Length >= 2 && span[0] == 0xFE && span[1] == 0xFF) {
return encoding.GetString(span[2..]); // 跳过 UTF-16 BE BOM
}
if (encoding.Equals(Encoding.Unicode) && span.Length >= 2 && span[0] == 0xFF && span[1] == 0xFE) {
return encoding.GetString(span[2..]); // 跳过 UTF-16 LE BOM
}
if (encoding.Equals(Encoding.UTF32) && span.Length >= 4 && span[0] == 0xFF && span[1] == 0xFE && span[2] == 0x00 && span[3] == 0x00) {
return encoding.GetString(span[4..]); // 跳过 UTF-32 LE BOM
}
if (encoding.CodePage == Encoding.GetEncoding("utf-32BE").CodePage && span.Length >= 4 && span[0] == 0x00 && span[1] == 0x00 && span[2] == 0xFE && span[3] == 0xFF) {
return encoding.GetString(span[4..]); // 跳过 UTF-32 BE BOM
}
return encoding.GetString(span); // 无 BOM 或其他编码
}
// 无 BOM 或检测为 Encoding.Default,尝试 UTF-8
try {
var utf8Result = Encoding.UTF8.GetString(bytes);
return utf8Result.Contains('\uFFFD') ? Encodings.GB18030.GetString(bytes) : utf8Result; // 无效 UTF-8,回退到 GB18030
} catch (DecoderFallbackException) {
return Encodings.GB18030.GetString(bytes); // UTF-8 解码失败,回退到 GB18030
}
}
}