【发布时间】:2021-11-05 08:57:06
【问题描述】:
我已经用谷歌搜索了几个小时,但找不到任何东西。 所以,我有一个证书,其主题的简单名称中有“ОАО”(俄语字母)。 我使用这段代码得到这个值:
var x509 = new X509Certificate2(certificateBytes);
var subjectName = x509.GetNameInfo(X509NameType.SimpleName, forIssuer: false);
在 Windows 上,此代码返回“ОАО”并保存到 MS SQL 中。
但在 Docker 容器中的 Linux 上,此代码返回转义的 unicode 字符,但大写。
他们在这里:
\U041E\U0410\U041E
代替:
\u041E\u0410\u041E
而且这个上限正在被保存,而不是“ОАО”。因此,当我什么都不做时,它是 \U1234,它按原样写入数据库中:字面意思是 \U1234。但是当我执行 .ToLower() 转换时,此代码转换为 \u1234 并被识别为“ОАО”。 所以我想出了一个技巧,但我不确定这是正确的做法。无论如何,这确实将我的文本保存为数据库中的“ОАО”:
var subjectName = Regex.Unescape(x509.GetNameInfo(X509NameType.SimpleName, forIssuer: false).ToLowerInvariant());
你怎么看?这是一个错误吗?为什么这种方法会这样?为什么它'capses' unicode escape /u-character? 这是解决问题的正确方法吗? 我是否会遇到这样的情况:我会找到一些区分大小写的 unicode 字符,在这种情况下我可能会丢失这些字符或者它们不区分大小写?
【问题讨论】:
-
在这种情况下,“U”而不是“u”有什么问题吗?
-
@AgentFire 是的。看,数据库不把它识别为有效的 unicode 字符,所以它是不可读的。而且我无法以任何方式将其解码回俄语。甚至 C# 本身也使用 \u 作为转义字符,因此它可以识别它。我不喜欢编码,所以我可能错了。无论哪种方式,我都很困惑为什么 \U1234 是按原样写的,但 \u1234 被识别为一个字符。我认为 \U 是无效的转义。我将更新问题以澄清此案为何重要。
-
您呈现的 char 数组 - "\u1234" - 只是一个简单的字符串,老实说,我不太了解 为什么 您的数据库尝试解码它。我也不明白你是如何得到那个“转义”的字符串。当然
x509.GetNameInfo不会返回转义字符串,迫使您将其取消转义。 -
您能否分享(或识别)有关此问题的证书?我真的很好奇这个名字是如何被编码来产生这样的结果的。
-
@AgentFire 很抱歉,但也许
Regex.Unescape()甚至没有必要?好吧,也许当我将输出小写时,它已经没有转义,可以保存并用俄语阅读。x509.GetNameInfo完全返回我写的内容:'U\1234' 因此数据库中存在不可读的神秘文本。