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

5jvtdoz2  于 2022-11-22  发布在  Docker
关注(0)|答案(2)|浏览(137)
  • Asp.net2.0 Web应用程序接口
  • 使用正式的Microsoft Docker映像(microsoft/aspnetcore)在Docker容器中运行

编码:

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

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

kknvjkwl

kknvjkwl1#

我知道这篇文章已经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,如上面的代码示例所示,但这是一个高成本的操作)。

aij0ehis

aij0ehis2#

我asp.net在docker(Alpine,Ubuntu)中的www.example.com.net 6也遇到了同样的问题。当在c#源文件中设置一个字符串时,应用程序返回非英语字符,例如var str =“Sedán”;
修复方法是用不同的编码保存包含字符串变量的C#文件。我有Windows 1250,改为UTF-8修复了这个问题。
对于VS 2022,转到文件-〉保存[文件]为,并点击保存按钮旁边的插入符号,然后保存编码。

相关问题