asp.net docker 上运行的核心未正确编码拉丁字符


  • Asp.net Core 2.0 Web API
  • 使用官方Microsoft Docker镜像(Microsoft/ASPNETCORE)在Docker容器中运行

法典:

[HttpGet]
[Route("test")]
public IActionResult Get()
{
return Ok("Sedán");
}

问题:

在 Docker 中运行时,单词Sedán被编码为Sed�n。在Windows上,它被编码为Sedán这是正确的

我知道这篇文章已经有 3 年的历史了,但这可以帮助未来的开发人员发现此类问题。

经过一番研究,我发现.net中的字符串编码是UTF-16。

"这取决于字符串'来自'的位置。.NET 字符串是 Unicode (UTF-16)。例如,如果您将数据从数据库读取到字节数组中,则唯一的方式可能会有所不同。

因此,我的怀疑是,如果您的环境具有不支持这些字符的编码器的预设配置,例如Encoding.Unicode,它将显示一个凌乱的字符串:

public static void Main()
{
string testString = "Sedán";
Console.WriteLine(Utf16ToUnicode(testString));
}
public static string Utf16ToUnicode(string utf16String)
{
// Get UTF16 bytes and convert UTF16 bytes to UNICODE bytes
byte[] utf16Bytes = Encoding.Unicode.GetBytes(utf16String);
byte[] unicodeBytes = Encoding.Convert(Encoding.Unicode, Encoding.Unicode, utf16Bytes);
// Return UNICODE bytes as ANSI string
return Encoding.Default.GetString(unicodeBytes);
}

输出:塞德·

我也有类似的问题。我的 docker 容器在 Debian 10 镜像下运行,根据本文,没有设置默认语言环境。我不知道这会导致哪些影响,但就我而言,如果编码字符串为 UTF-16,则当我尝试呈现货币单位时,会显示"替换字符"。因此,为了解决这个问题,我使用了 .NET 的资源管理来获取 UTF-8 的值(注意:我可以以编程方式将 UTF-16 转换为 UTF-8,如上面的代码示例所示,但这是一个高成本的操作)。

我在Docker(Alpine,Ubuntu)中使用 asp.net .net 6时遇到了同样的问题。在 c# 源文件中设置字符串时,应用返回非英语字符,例如 var str = "Sedán";

解决方法是使用不同的编码保存包含字符串变量的 c# 文件。我有 Windows 1250,更改为 utf-8 解决了这个问题。

对于 VS 2022,转到文件 -> 将 [文件] 另存为并点击保存按钮旁边的插入符号,然后点击使用编码保存。

最新更新