在 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 核心未正确编码拉丁字符的主要内容,如果未能解决你的问题,请参考以下文章
如何在不使用 Visual Studio 的情况下直接在 Docker 容器上运行 ASP.NET Core Web 应用程序
来自 FTP 的图像未显示在 asp.net 核心的 HTML 页面上