将字符串转换为UTF-16编码C#

将字符串转换为UTF-16编码C#,c#,string,character-encoding,urlencode,C#,String,Character Encoding,Urlencode,我有几个字符串是1252编码的,UTF-8和UTF-16编码的。最终,我必须将所有字符串转换为UTF-16编码进行比较,我该怎么做? 我遇到过,如果我们知道源编码,我们可以转换为目标编码,但我需要将字符串(可以以任何格式编码)转换为UTF-16(默认) 此时,parsedurl.AbsoluteUri打印file:///C:/Users/ %C5%92ser/file.html,应为 然后我在IE WebBrowserControl中加载html文件 我拦截导航 strURL=URL.To

我有几个字符串是1252编码的,UTF-8和UTF-16编码的。最终,我必须将所有字符串转换为UTF-16编码进行比较,我该怎么做? 我遇到过,如果我们知道源编码,我们可以转换为目标编码,但我需要将字符串(可以以任何格式编码)转换为UTF-16(默认)

此时,parsedurl.AbsoluteUri打印file:///C:/Users/ %C5%92ser/file.html,应为

然后我在IE WebBrowserControl中加载html文件 我拦截导航 strURL=URL.ToString();
现在是strURL印花file:///C:/Users/%8Cser/file.html.NET
string
值始终是UTF-16(至少在
Utf8String
之前是这样,现在看起来像.NET 7或.NET 8)。因此,假设您有一些字节或流是以各种编码编码的,您希望转换为UTF-16
string
实例

这里的关键是
编码
;例如:

  • var enc=Encoding.GetEncoding(1252)
  • var enc=Encoding.UTF8
  • var enc=Encoding.bigendianucode(UTF-16,大端)
  • var enc=Encoding.Unicode(UTF-16,小端)
您可以手动使用此编码(
GetString(…)
GetEncoder(…)
等),也可以将其作为可选的构造函数参数传递给
TextReader
,例如
StreamReader

请注意,1252可能在.NET Core/.NET 5(仅.NET Framework)中不可用,因为它取决于OS编码目录。您可能必须满足于“西欧(ISO)”(ISO-8859-1,代码页28591,即
Encoding.GetEncoding(28591)

发件人:

ISO-8859-1(也称为拉丁语-1)与Windows-1252(也称为CP1252)相同,只是代码点128-159(0x80-0x9F)不同。ISO-8859-1在此范围内分配了多个控制代码。Windows-1252为这些代码点分配了多个字符、标点符号、算术和业务符号


类似地,
编码
可用于写入任何选择的编码,如果您想再次获取字节-可能使用UTF-16变体。

如果您有一些表示字符串的字节,但您不知道正在使用编码,则无法将这些字节转换为字符串。例如,您可以通过查找BOM表进行猜测,但很难区分在UTF8中表示无BOM字符串的某些字节与在1252.NET中表示字符串的某些字节之间的区别。字符串始终是UTF-16(至少在
Utf8String
,现在看起来像.NET 7或.NET 8);你的意思是你有一些1252编码的字节,UTF-8和UTF-16编码的字节,你想把它们读入每个字节的
string
值吗?@marcGravel是的,字符串内部被转换成1252,UTF-8并转换成string对象,我需要把string对象转换回UTF-16@rac10字符串为UTF-16;我可以向您保证
字符串
实例不是1252、UTF-8或任何其他经过编辑的东西:您谈论的是与文本编码非常不同的东西,如UTF-16等-您谈论的是Uri%-编码;完全不同的话题;这听起来像是真正的问题:“IE浏览器控件正在使用一个意外的unicode URI代码页,而不是使用UTF8%编码”-为此,我怀疑可能没有什么补救措施-最终IE(以及IE浏览器控件)是死的、过时的、不推荐的、空的、无效的,尼克斯,我也说过:死了?我面临的问题是字符串从%C5%92转换为1252%8C@rac10我认为你需要非常小心地定义这里的问题;Œ在1252中确实由十进制140(十六进制8C)表示,是unicode码点hex 0152,在UTF-8中是十六进制C592-所以。。。听起来好像一切正常?您需要非常清楚地指定您的输入和预期输出,以获得更多的建议;还请注意,这是在1252和iso-8859-1之间不同的范围内,因此:如果使用.NET Core,则需要非常小心。我加载的html文件中,文件名包含字符,如Œ(UTF-8编码,我使用URI),我在IE WebBrowserControl中加载文件名,并截获导航并再次读取文件名,现在文件名有1252个编码文件名又大不相同了;我怀疑我们在这里谈论的是名称,任何.NET API谈论的文件名都将是一个
字符串
,任何编码问题都超出了您的视野;同样,我们在这里真正需要的是代码,它说明了您正面临的问题(依赖项最少),显示了输入、当前输出和预期输出。如果没有这一点,就不可能进一步发表评论。我不想成为一个痛苦的人,但当你开始谈论编码问题时,细节真的非常重要。如果你需要更多信息,请告诉我
 var url=@"file:///C:/Users/Œser/file.html";
Uri parsedurl;
var pass=Uri.TryCreate(url.Trim(),UriKind.Absolute,out parsedurl);