有一条线像
string s ="\u0431\u044b\u0442\u044c 12 \u0446\u0438\u0444\u0440."
如果我将它插入到一些在线服务中,那么它被成功解码为
быть 12 цифр.
在线服务显示不同的编码,由他自动选择。比如那个原文是unicode,翻译后是UTF8
好的,我们用 C# 写同样的东西
string substring ="\u0431\u044b\u0442\u044c 12 \u0446\u0438\u0444\u0440."
Encoding utf8 = Encoding.UTF8;
Encoding unicode = Encoding.Unicode;
// Convert the string into a byte array.
byte[] unicodeBytes = unicode.GetBytes(substring);
// Perform the conversion from one encoding to the other.
byte[] utf8Bytes = Encoding.Convert(unicode, utf8, unicodeBytes);
// Convert the new byte[] into a char[] and then into a string.
char[] utf8Chars = new char[utf8.GetCharCount(utf8Bytes, 0, utf8Bytes.Length)];
utf8.GetChars(utf8Bytes, 0, utf8Bytes.Length, utf8Chars, 0);
string utf8String = new string(utf8Chars);
Console.WriteLine(utf8string);
在输出中我们得到完全相同的
\u0431\u044b\u0442\u044c 12 \u0446\u0438\u0444\u0440.
据我了解,我误解了编码的本质 - 编码对字节进行编码,字符串最初是用 C# 内部的东西编码的,可能是相同的 UTF8,所以它不会尝试重新编码字符 \u0431 和其余部分转换为西里尔文,但只是认为该字符串已经是 UTF8。
问题是如何将这些相同的转义序列提供给解码器,这意味着某种西里尔字符,以便最终它给我与在线服务相同的东西?
应评论员的要求,我推导出utf8chars,这是一个chars数组,所以我通过foreach推导出来
结论
\
你
0
四
四
和
一
2
正确答案后评论。
32 分钟前回答
@vp_arth
Regex.Unescape 有帮助。确实,结果很不方便——我想缩短问题,所以我提前写了这行。但实际上我是从网络请求中得到这个字符串的,当我输出它时,我得到了未解码的字符。如果您再次获取字符并将它们敲成一个字符串,则所有内容都会正确显示。显然,该行只是第一次执行 Regex.Unescape,因此它重新正确输出
在这样的字符串中已经有解码的字符:
这是带有斜杠的原始行,例如,可以手动替换它们:
或者更简单: