none
C#如何实现将unicode编码转化为中文? RRS feed

  • 问题

  • 如题,我有一个unicode编码的下载地址,我想实现将其转化为string,求大牛写一段代码帮忙实现:

    http\u003a//main\u002egslb\u002eku6\u002ecom/s0/KdjZUaVN1cL2\u002dE2x/1389762233399/b9d1289d28d2b5bd6581a038ba73bef9/1390451396689/v640/38/92/5c953805672bbf9bbec251ead0e331a6\u002df4v\u002dh264\u002daac\u002d882\u002d32\u002d299908\u002e0\u002d34513983\u002d1389762185213\u002da584ef2f40178df2439f762919b7ffdf\u002d1\u002d00\u002d00\u002d00\u002ef4v

    最好贴出代码和运行结果,谢谢,各位大牛。


    2014年1月23日 6:04

答案

  • 试一下这个:

    class Program { static void Main(string[] args) { string s = "http\\u003a//main\\u002egslb\\u002eku6\\u002ecom/s0/KdjZUaVN1cL2\\u002dE2x/1389762233399/b9d1289d28d2b5bd6581a038ba73bef9/1390451396689/v640/38/92/5c953805672bbf9bbec251ead0e331a6\\u002df4v\\u002dh264\\u002daac\\u002d882\\u002d32\\u002d299908\\u002e0\\u002d34513983\\u002d1389762185213\\u002da584ef2f40178df2439f762919b7ffdf\\u002d1\\u002d00\\u002d00\\u002d00\\u002ef4v"; Console.WriteLine(s); Console.WriteLine("--------------------------"); string output = Convert(s); Console.WriteLine(output); Console.Read(); }

            /// <summary>
            /// unicode编码的下载地址转化为string
            /// </summary>

    public static string Convert(string input) { CSharpCodeProvider ccp = new CSharpCodeProvider(); CompilerParameters para = new CompilerParameters(); StringBuilder buffer = new StringBuilder(); buffer.AppendLine("using System;"); buffer.AppendLine("namespace Temp"); buffer.AppendLine("{"); buffer.AppendLine("public class Temp"); buffer.AppendLine("{"); buffer.AppendLine("public string result = \"" + input + "\";"); buffer.AppendLine("}"); buffer.AppendLine("}"); CompilerResults result = ccp.CompileAssemblyFromSource(para, buffer.ToString()); object tmp = result.CompiledAssembly.CreateInstance("Temp.Temp"); Type type = tmp.GetType(); return (string)type.GetField("result").GetValue(tmp); } }


    2014年1月23日 9:13
  • 没有作用,你能把你转换出来的结果截图一下吗?

    上面是转换前的,下面是转换后的

    2014年1月23日 10:01
  • 将 Unicode 字串转为 Byte[] 后再利用 System.Text.Encoding 解码成原始字串

    string str = "http\u003a//main\u002egslb\u002eku6\u002ecom/s0/KdjZUaVN1cL2\u002dE2x/1389762233399/b9d1289d28d2b5bd6581a038ba73bef9/1390451396689/v640/38/92/5c953805672bbf9bbec251ead0e331a6\u002df4v\u002dh264\u002daac\u002d882\u002d32\u002d299908\u002e0\u002d34513983\u002d1389762185213\u002da584ef2f40178df2439f762919b7ffdf\u002d1\u002d00\u002d00\u002d00\u002ef4v";
    
    System.Text.UnicodeEncoding encodingUNICODE = new System.Text.UnicodeEncoding();
    
    encodingUNICODE.GetString(new UnicodeEncoding().GetBytes(str));

    转换后为:

    http://main.gslb.ku6.com/s0/KdjZUaVN1cL2-E2x/1389762233399/b9d1289d28d2b5bd6581a038ba73bef9/1390451396689/v640/38/92/5c953805672bbf9bbec251ead0e331a6-f4v-h264-aac-882-32-299908.0-34513983-1389762185213-a584ef2f40178df2439f762919b7ffdf-1-00-00-00.f4v



    2014年1月23日 15:48
  • 仅仅是用convert而不是convert.to...是不行的,还是采用David  Kuo的方法较好,求修改代码。


    我说的Convert函数就是我上面代码中提供的函数:

     /// <summary>
            /// unicode编码的下载地址转化为string
            /// </summary>

    public static string Convert(string input)

    我知道有些东西难以理解,但是我建议你可以先试一下在给出结论看到底用Convert函数行不行

    textbox2.Text = Convert(textbox1.Text);



    2014年1月24日 3:45
  • 多谢,请问还有没有更简单的方法实现解码呢?这种方法确实有一点难。

    Sorry,我刚发现一个简单的方法,试一下:

    textbox2.Text = Regex.Unescape(textbox1.Text);

    这样就没必要使用上面的Convert函数,绕了一个圈子


    2014年1月24日 8:26

全部回复

  • 试一下这个:

    class Program { static void Main(string[] args) { string s = "http\\u003a//main\\u002egslb\\u002eku6\\u002ecom/s0/KdjZUaVN1cL2\\u002dE2x/1389762233399/b9d1289d28d2b5bd6581a038ba73bef9/1390451396689/v640/38/92/5c953805672bbf9bbec251ead0e331a6\\u002df4v\\u002dh264\\u002daac\\u002d882\\u002d32\\u002d299908\\u002e0\\u002d34513983\\u002d1389762185213\\u002da584ef2f40178df2439f762919b7ffdf\\u002d1\\u002d00\\u002d00\\u002d00\\u002ef4v"; Console.WriteLine(s); Console.WriteLine("--------------------------"); string output = Convert(s); Console.WriteLine(output); Console.Read(); }

            /// <summary>
            /// unicode编码的下载地址转化为string
            /// </summary>

    public static string Convert(string input) { CSharpCodeProvider ccp = new CSharpCodeProvider(); CompilerParameters para = new CompilerParameters(); StringBuilder buffer = new StringBuilder(); buffer.AppendLine("using System;"); buffer.AppendLine("namespace Temp"); buffer.AppendLine("{"); buffer.AppendLine("public class Temp"); buffer.AppendLine("{"); buffer.AppendLine("public string result = \"" + input + "\";"); buffer.AppendLine("}"); buffer.AppendLine("}"); CompilerResults result = ccp.CompileAssemblyFromSource(para, buffer.ToString()); object tmp = result.CompiledAssembly.CreateInstance("Temp.Temp"); Type type = tmp.GetType(); return (string)type.GetField("result").GetValue(tmp); } }


    2014年1月23日 9:13
  • 没有作用,你能把你转换出来的结果截图一下吗?
    2014年1月23日 9:55
  • 没有作用,你能把你转换出来的结果截图一下吗?

    上面是转换前的,下面是转换后的

    2014年1月23日 10:01
  • 能说明一下你给出的代码吗?特别是转换的核心部分
    2014年1月23日 13:21
  • 将 Unicode 字串转为 Byte[] 后再利用 System.Text.Encoding 解码成原始字串

    string str = "http\u003a//main\u002egslb\u002eku6\u002ecom/s0/KdjZUaVN1cL2\u002dE2x/1389762233399/b9d1289d28d2b5bd6581a038ba73bef9/1390451396689/v640/38/92/5c953805672bbf9bbec251ead0e331a6\u002df4v\u002dh264\u002daac\u002d882\u002d32\u002d299908\u002e0\u002d34513983\u002d1389762185213\u002da584ef2f40178df2439f762919b7ffdf\u002d1\u002d00\u002d00\u002d00\u002ef4v";
    
    System.Text.UnicodeEncoding encodingUNICODE = new System.Text.UnicodeEncoding();
    
    encodingUNICODE.GetString(new UnicodeEncoding().GetBytes(str));

    转换后为:

    http://main.gslb.ku6.com/s0/KdjZUaVN1cL2-E2x/1389762233399/b9d1289d28d2b5bd6581a038ba73bef9/1390451396689/v640/38/92/5c953805672bbf9bbec251ead0e331a6-f4v-h264-aac-882-32-299908.0-34513983-1389762185213-a584ef2f40178df2439f762919b7ffdf-1-00-00-00.f4v



    2014年1月23日 15:48
  • 能说明一下你给出的代码吗?特别是转换的核心部分

    C#的编译器能自动识别unicode转义符\u,并且会把\uxxxx自动转换成相应的字符,你可以试一下直接把那个字符串拷贝到VisualStudio的代码编辑器那里赋值给一个string,比如

    string s = "http\u003a//main\u002egslb\u002eku6\u002ecom/s0/KdjZUaVN1cL2\u002dE2x/1389762233399/b9d1289d28d2b5bd6581a038ba73bef9/1390451396689/v640/38/92/5c953805672bbf9bbec251ead0e331a6\u002df4v\u002dh264\u002daac\u002d882\u002d32\u002d299908\u002e0\u002d34513983\u002d1389762185213\u002da584ef2f40178df2439f762919b7ffdf\u002d1\u002d00\u002d00\u002d00\u002ef4v";

    然后直接输出s的内容

    Console.WriteLine(s);

    你会发现输出的就是解码后的正确的字符,这是因为在编译时,编译器已经自动把\u003a等以unicode形式书写的字符转换好了。

    所以程序里面核心的代码Convert函数就是利用了编译器的这个功能,直接让编译器帮转换字符串然后获取转换后的字符串。

    2014年1月23日 16:08
  • 如果我将字符串放在textbox中,想将其转换过来,能帮忙修改一下相应的代码吗?谢谢
    2014年1月24日 3:03
  • 如果我将字符串放在textbox中,想将其转换过来,能帮忙修改一下相应的代码吗?谢谢

    假设你的字符串在textbox1中,然后你想要把转换后的结果显示在textbox2中,只需要一行代码:

    textbox2.Text = Convert(textbox1.Text)

    2014年1月24日 3:21
  • 仅仅是用convert而不是convert.to...是不行的,还是采用David  Kuo的方法较好,求修改代码。


    2014年1月24日 3:37
  • 仅仅是用convert而不是convert.to...是不行的,还是采用David  Kuo的方法较好,求修改代码。


    我说的Convert函数就是我上面代码中提供的函数:

     /// <summary>
            /// unicode编码的下载地址转化为string
            /// </summary>

    public static string Convert(string input)

    我知道有些东西难以理解,但是我建议你可以先试一下在给出结论看到底用Convert函数行不行

    textbox2.Text = Convert(textbox1.Text);



    2014年1月24日 3:45
  • 那请问CSharpCodeProvider和CompilerParameters 是什么呀,还有其中的streambuilder是不是可以不要呢?
    2014年1月24日 4:50
  • 那请问CSharpCodeProvider和CompilerParameters 是什么呀,还有其中的streambuilder是不是可以不要呢?

    CSharpCodeProvider是用来进行C#代码编译的一个类,请看以下介绍

    http://msdn.microsoft.com/zh-cn/library/microsoft.csharp.csharpcodeprovider(VS.80).aspx

    因为转换的过程实际上就是动态编译C#代码的过程,所以要用到CSharpCodeProvider,CompilerParameters则是编译选项,在这里用缺省的就可以了。

    StringBuilder是用来保存动态书写的C#代码的。

    2014年1月24日 7:57
  • 多谢,请问还有没有更简单的方法实现解码呢?这种方法确实有一点难。
    2014年1月24日 8:19
  • 多谢,请问还有没有更简单的方法实现解码呢?这种方法确实有一点难。

    Sorry,我刚发现一个简单的方法,试一下:

    textbox2.Text = Regex.Unescape(textbox1.Text);

    这样就没必要使用上面的Convert函数,绕了一个圈子


    2014年1月24日 8:26
  • 成功了,非常感谢
    2014年1月24日 9:26