积极答复者
C#如何实现将unicode编码转化为中文?

问题
-
如题,我有一个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日 7:09
- 已移动 VisualEleven 2014年1月24日 5:20 C#
答案
-
试一下这个:
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月24日 7:47
-
将 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
-
仅仅是用convert而不是convert.to...是不行的,还是采用David Kuo的方法较好,求修改代码。
我说的Convert函数就是我上面代码中提供的函数:
/// <summary>
/// unicode编码的下载地址转化为string
/// </summary>public static string Convert(string input)
我知道有些东西难以理解,但是我建议你可以先试一下在给出结论看到底用Convert函数行不行
textbox2.Text = Convert(textbox1.Text);
全部回复
-
试一下这个:
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月24日 7:47
-
将 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
-
能说明一下你给出的代码吗?特别是转换的核心部分
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函数就是利用了编译器的这个功能,直接让编译器帮转换字符串然后获取转换后的字符串。
-
仅仅是用convert而不是convert.to...是不行的,还是采用David Kuo的方法较好,求修改代码。
我说的Convert函数就是我上面代码中提供的函数:
/// <summary>
/// unicode编码的下载地址转化为string
/// </summary>public static string Convert(string input)
我知道有些东西难以理解,但是我建议你可以先试一下在给出结论看到底用Convert函数行不行
textbox2.Text = Convert(textbox1.Text);
-
那请问CSharpCodeProvider和CompilerParameters 是什么呀,还有其中的streambuilder是不是可以不要呢?
CSharpCodeProvider是用来进行C#代码编译的一个类,请看以下介绍
http://msdn.microsoft.com/zh-cn/library/microsoft.csharp.csharpcodeprovider(VS.80).aspx
因为转换的过程实际上就是动态编译C#代码的过程,所以要用到CSharpCodeProvider,CompilerParameters则是编译选项,在这里用缺省的就可以了。