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

Posted

技术标签:

【中文标题】在 docker 上运行的 asp.net 核心未正确编码拉丁字符【英文标题】:asp.net core running on docker not encoding Latin characters correctly 【发布时间】:2018-07-01 15:52:19 【问题描述】: 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,这是正确的

【问题讨论】:

【参考方案1】:

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

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

"It depends where the string 'came from'. A .NET string is Unicode (UTF-16). The only way it could be different if you, say, read the data from a database into a byte array.".

所以,我的怀疑是,如果您的环境具有不支持这些字符的编码器的预设配置,例如 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);

输出:Sed�n

我遇到了类似的问题。我的 docker 容器在 Debian 10 映像下运行,并且根据此 article,没有设置默认语言环境。我不知道这可能会导致什么影响,但在我的情况下,如果编码字符串是 UTF-16,当我尝试呈现货币单位时,会显示“替换字符”。因此,为了解决这个问题,我使用了 .NET 的资源管理来获取 UTF-8 的值(注意:我可以通过编程方式将 UTF-16 转换为 UTF-8,正如我在上面的代码示例中所示,但它的高成本的操作)。

【讨论】:

以上是关于在 docker 上运行的 asp.net 核心未正确编码拉丁字符的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET 核心 CORS 标头未显示

如何在不使用 Visual Studio 的情况下直接在 Docker 容器上运行 ASP.NET Core Web 应用程序

asp.net 核心存储图像 wwwroot docker

来自 FTP 的图像未显示在 asp.net 核心的 HTML 页面上

如何在 Mac 上将 ASP.Net Core 连接到 SQL Server Docker 容器

asp.net核心未绑定当前用户