.NET 5:X509Certificate.GetNameInfo 大写 unicode 转义字符
.NET 5: X509Certificate.GetNameInfo Uppercases unicode escape characters
我已经用谷歌搜索了几个小时,但找不到任何东西。
所以,我有一个证书,其主题的简单名称中包含“ОАО”(俄语字母)。
我使用此代码获得此值:
var x509 = new X509Certificate2(certificateBytes);
var subjectName = x509.GetNameInfo(X509NameType.SimpleName, forIssuer: false);
在 Windows 上,此代码 returns 'ОАО' 将保存到 MS SQL。
但是在 Docker 容器中的 Linux 上,此代码 returns 转义了 unicode 字符, 但大写。
他们在这里:
\U041E\U0410\U041E
而不是:
\u041E\u0410\u041E
并且将保存此上限而不是“ОАО”。所以当我什么都不做时,它是 \U1234 并且它按原样写入数据库:字面意思是 \U1234。但是当我执行 .ToLower() 转换时,此代码转换为 \u1234 并被识别为“ОАО”。
所以我想出了一个 hack,但我不确定这是正确的做法。无论如何,这确实将我的文本保存为数据库中的“ОАО”:
var subjectName = Regex.Unescape(x509.GetNameInfo(X509NameType.SimpleName, forIssuer: false).ToLowerInvariant());
你怎么看?这是一个错误吗?为什么这个方法会这样?为什么它 'capses' unicode escape /u-character?
这是解决问题的正确方法吗?
我会遇到这样的情况,我会发现一些 unicode 区分大小写的字符,在这种情况下我可能会丢失这些字符或者它们不区分大小写吗?
Is this a bug?
是的,这是一个错误,已经 fixed in .NET 6 RC2(尚未发布,但是是 .NET 6 预览版的下一个版本)。
使用 OpenSSL 的 Linux 实现无意中转义了非 ASCII 文本。
我已经用谷歌搜索了几个小时,但找不到任何东西。 所以,我有一个证书,其主题的简单名称中包含“ОАО”(俄语字母)。 我使用此代码获得此值:
var x509 = new X509Certificate2(certificateBytes);
var subjectName = x509.GetNameInfo(X509NameType.SimpleName, forIssuer: false);
在 Windows 上,此代码 returns 'ОАО' 将保存到 MS SQL。
但是在 Docker 容器中的 Linux 上,此代码 returns 转义了 unicode 字符, 但大写。
他们在这里:
\U041E\U0410\U041E
而不是:
\u041E\u0410\u041E
并且将保存此上限而不是“ОАО”。所以当我什么都不做时,它是 \U1234 并且它按原样写入数据库:字面意思是 \U1234。但是当我执行 .ToLower() 转换时,此代码转换为 \u1234 并被识别为“ОАО”。 所以我想出了一个 hack,但我不确定这是正确的做法。无论如何,这确实将我的文本保存为数据库中的“ОАО”:
var subjectName = Regex.Unescape(x509.GetNameInfo(X509NameType.SimpleName, forIssuer: false).ToLowerInvariant());
你怎么看?这是一个错误吗?为什么这个方法会这样?为什么它 'capses' unicode escape /u-character? 这是解决问题的正确方法吗? 我会遇到这样的情况,我会发现一些 unicode 区分大小写的字符,在这种情况下我可能会丢失这些字符或者它们不区分大小写吗?
Is this a bug?
是的,这是一个错误,已经 fixed in .NET 6 RC2(尚未发布,但是是 .NET 6 预览版的下一个版本)。
使用 OpenSSL 的 Linux 实现无意中转义了非 ASCII 文本。