C# 如何在c中取消显示多字节unicode#

C# 如何在c中取消显示多字节unicode#,c#,text,unicode,C#,Text,Unicode,文本文件中的以下unicode字符串使用3个字节对单个撇号进行编码: 它\u00e2\u0080\u0099正在工作 这应解码为: 它起作用了 如何在C#中解码此字符串 例如,当我尝试以下代码时: string test = @"It\u00e2\u0080\u0099s working"; string test2 = System.Text.RegularExpressions.Regex.Unescape(test); 它仅错误地解码第一个字节: 太棒了 这就是jav

文本文件中的以下unicode字符串使用3个字节对单个撇号进行编码:

它\u00e2\u0080\u0099正在工作

这应解码为:

它起作用了

如何在C#中解码此字符串

例如,当我尝试以下代码时:

string test = @"It\u00e2\u0080\u0099s working";
string test2 = System.Text.RegularExpressions.Regex.Unescape(test);
它仅错误地解码第一个字节:

太棒了


这就是javascript unicode编码。使用C#javascript反序列化程序对其进行转换

(我没有足够的声誉发表评论,所以我会在这里写)

你最初是从哪里得到这些角色的

\Uxxx是JavaScript和C#使用的一种编码(直到现在才知道C#这一点),用于对字符串文本中的16位Unicode字符进行编码。16位-4个十六进制字符,so\uxxx,每个X代表一个十六进制数字

注意,这是用来在源代码中对字符串文字进行编码的!它不用于对存储在文件或内存中的字节进行编码。由于现代源代码编辑器通常支持UTF-8或UTF-16或其他编码,因此它是一种较旧的编码方式,以便能够在源代码文件中存储unicode字符,然后还能够显示unicode字符符号,并允许在编辑器中直接键入。因此\uxxx不需要打字,而且已经过时了

这就是为什么我问你最初从哪里得到的字符串?你在一条评论中写道你是从文件中读到的?是什么生成了这个文件

如果每个\uxxx单独作为unicode字符,这就是\uxxx的意思,那么在那里就没有意义了。00e2是一个大写字符a,0080和0099是控制字符,不可打印

如果e28099合并为三个单字节,即删除每个字节的00值第一个字节,因为它们是\u00XX的形式,那么它适合作为具有十进制值2019的Unicode字符的UTF8字符表示,即 那么这就是您要寻找的,但这似乎不是生成该字符串的编码的正确用法。如果您最终得到了这些字符串,并且必须对它们进行求值,那么上面由“C#新手”所做的注释是有效的,但它可能并不适用于所有情况

您可以使用javascript脚本计算器或CSharpScript.Run()转换字符串中使用\uxxx编码的字符串文字,以使用这些文字生成字符串文字并分配给变量,然后查看其字节。但后来我试过了,由于这些字节值/字符没有意义,我从中没有得到任何有意义的东西。我得到了一个带帽的a,接下来的两个,CSharpScript拒绝解码并按原样离开。因为解码时这些是控制字符

这里有三种使用C可用库进行\uxxx解码的不同方法。前两个使用NewtonSoft.JSON包,最后一个使用Roslyn/CSharpScript,两者都可以从Nuget获得。请注意,由于我上面所描述的原因,这些打印的单撇号都没有。相反,如果我将字符串更改为“\u3053\u3093\u306B\u3061\u306F\u4E16\u754C!”,它将在调试输出窗口上打印以下日文文本:こんにちは世界!" , 谷歌翻译告诉我的是“你好,世界!”!"

总之,不管是什么生成了这些脚本,似乎都不是在做标准的事情

            string test = @"It\u00e2\u0080\u0099s working";

            // Using JSON deserialization, since \uXXXX is valid encoding JavaScript string literals
            // Have to add starting and ending quotes to make it a script literal definition, then deserialize as string
            var d = Newtonsoft.Json.JsonConvert.DeserializeObject("\"" + test + "\"", typeof(string));
            Console.WriteLine(d);
            System.Diagnostics.Debug.WriteLine(d);

            // Another way of JavaScript deserialization. If you are using a stream like reading from file this maybe better:
            TextReader reader = new StringReader("\"" + test + "\"");
            Newtonsoft.Json.JsonTextReader rdr = new JsonTextReader(reader);
            rdr.Read();
            Console.WriteLine(rdr.Value);
            System.Diagnostics.Debug.WriteLine(rdr.Value);

            // lastly overkill and too heavy:  Using Roslyn CSharpScript, and letting C# compiler to decode \uXXXX's in string literal:
            ScriptOptions opt = ScriptOptions.Default;
            //opt = opt.WithFileEncoding(Encoding.Unicode);
            Task<ScriptState<string>> task = Task.Run(async () => { return CSharpScript.RunAsync<string>("string str = \"" + test + "\".ToString();", opt); }).Result;
            ScriptState<string> s = task.Result;
            var ddd = s.Variables[0];
            Console.WriteLine(ddd.Value);
            System.Diagnostics.Debug.WriteLine(ddd.Value);
string test=@“It\u00e2\u0080\u0099s正在工作”;
//使用JSON反序列化,因为\uxxx是编码JavaScript字符串文本的有效方法
//必须添加起始引号和结束引号,使其成为脚本文字定义,然后反序列化为字符串
var d=Newtonsoft.Json.JsonConvert.DeserializeObject(“\”+test+“\”,typeof(string));
控制台写入线(d);
系统诊断调试写线(d);
//JavaScript反序列化的另一种方式。如果您正在使用类似于从文件读取的流,那么这可能更好:
TextReader=新的StringReader(“\”+测试+“\”);
Newtonsoft.Json.JsonTextReader rdr=新的JsonTextReader(阅读器);
rdr.Read();
控制台写入线(rdr值);
系统诊断调试写线(rdr值);
//最后一点:使用Roslyn CSharpScript,并让C#编译器以字符串文字解码\uxxx的代码:
ScriptOptions opt=ScriptOptions.Default;
//opt=opt.WithFileEncoding(Encoding.Unicode);
Task Task=Task.Run(async()=>{return CSharpScript.RunAsync(“string str=\”“+test+\”.ToString();”,opt);});
scriptstates=task.Result;
var ddd=s.变量[0];
控制台写入线(ddd值);
系统诊断调试写线(ddd值);

尝试以下方法来解析文件:

private static Regex _regex = new Regex(@"\\u(?<Value>[a-zA-Z0-9]{4})", RegexOptions.Compiled);
public string decodeString(string value)
{
    return _regex.Replace(
        value,
        m => ((char)int.Parse(m.Groups["Value"].Value, NumberStyles.HexNumber)).ToString()
    );
}
private static Regex\u Regex=new Regex(@“\\u(?[a-zA-Z0-9]{4})”,RegexOptions.Compiled);
公共字符串解码字符串(字符串值)
{
返回_regex.Replace(
价值
m=>((char)int.Parse(m.Groups[“Value”].Value,NumberStyles.HexNumber)).ToString()
);
}

这是UTF8。请尝试UTF8编码

using System.Text;
using System.Text.RegularExpressions;
string test = "It\u00e2\u0080\u0099s working";
byte[] bytes = Encoding.GetEncoding(28591)
                           .GetBytes(test);
var converted = Encoding.UTF8.GetString(bytes);//It’s working

感谢您的回答,但这似乎没有改变任何事情。“转换”的值是:如果从字符串文字中删除
@
,并将其设置为“正常”,则它\\u00e2\\u0080\\u0099s workingWorks“好的,现在可以了,谢谢。但是,如果我从文件中读取此字符串,如何将其从文本转换为普通字符串?@StackMan string[]linesRead=System.IO.file.ReadAllLines(@“E:\input.txt”,Encoding.GetEncoding(28591))@StackMan字符串测试=@“It\u00e2\u0080\U0099正在工作”;字符串unescaped=Regex.Unescape(测试);byte[]bytes=Encoding.GetEncoding(28591).GetBytes(unscaped);var converted=Encoding.UTF8.GetString(字节)//它起作用了