DotNet 5.0 IdnMapping.GetAscii 抛出 ArgumentException
Posted
技术标签:
【中文标题】DotNet 5.0 IdnMapping.GetAscii 抛出 ArgumentException【英文标题】:DotNet 5.0 IdnMapping.GetAscii throws ArgumentException 【发布时间】:2021-12-01 02:28:00 【问题描述】:我编写了一个示例控制台应用程序:
-
获取当前的 DotNet 版本
然后从拉丁字符串中获取ASCII(每个标签不超过63个符号,总字符串长度(包括点)为254个符号)
static void Main(string[] args)
Console.WriteLine("Environment.Version: " + Environment.Version);
new IdnMapping().GetAscii(
"sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss." +
"sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss." +
"sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss." +
"ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss");
Console.WriteLine("Hello World!");
当我在 .Net Core 3.1 上运行程序时,输出是:
Environment.Version: 3.1.13
Hello World!
当我在 .Net 5.0 上运行程序时,输出是:
Environment.Version: 5.0.9
Unhandled exception. System.ArgumentException: Decoded string is not a valid IDN name. (Parameter 'unicode')
at System.Globalization.IdnMapping.IcuGetAsciiCore(String unicodeString, Char* unicode, Int32 count)
at System.Globalization.IdnMapping.GetAscii(String unicode, Int32 index, Int32 count)
at System.Globalization.IdnMapping.GetAscii(String unicode, Int32 index)
at System.Globalization.IdnMapping.GetAscii(String unicode)
at Program.Main(String[] args)
DotNet 5 中是否有针对 IdnMapping 的重大更改? 输入字符串应该有什么要求?
【问题讨论】:
【参考方案1】:.NET 3.1 在 Windows 上使用 NLS(国家语言支持)API,在 Unix 上使用 ICU(Unicode 国际组件)库,这会导致在不同平台上运行应用程序时出现一些行为差异
.NET 5.0 使用 ICU 库,因此 IDN 的某些行为与 .NET 3.1 不同 https://docs.microsoft.com/en-us/dotnet/core/extensions/globalization-icu
【讨论】:
以上是关于DotNet 5.0 IdnMapping.GetAscii 抛出 ArgumentException的主要内容,如果未能解决你的问题,请参考以下文章
.NET SDK 5.0 版已成功安装,但 dotnet --list-sdks 仅显示 3.1.415 [/snap/dotnet-sdk/148/sdk]