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

【问题讨论】:

    标签: c# docker character-encoding .net-core asp.net-core-webapi


    【解决方案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,正如我在上面的代码示例中所示,但它的高成本的操作)。

    【讨论】:

      猜你喜欢
      • 2021-03-10
      • 2022-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-27
      • 2013-08-28
      • 1970-01-01
      相关资源
      最近更新 更多