【问题标题】:Encode cp1252 string to utf-8 string in c#在c#中将cp1252字符串编码为utf-8字符串
【发布时间】:2016-01-11 09:19:38
【问题描述】:

如何在 c# 中将 cp1252 字符串转换为 utf-8 字符串? 我试过这段代码,但它不起作用:

Encoding wind1252 = Encoding.GetEncoding(1252);
Encoding utf8 = Encoding.GetEncoding(1251);
byte[] wind1252Bytes = ReadFile(myString1252);
byte[] utf8Bytes = Encoding.Convert(wind1252, utf8, wind1252Bytes);
string myStringUtf8 = Encoding.UTF8.GetString(utf8Bytes);

【问题讨论】:

  • Encoding utf8 = Encoding.GetEncoding(1251); 代码页 1251 不是 utf8。
  • Encoding utf8 = Encoding.UTF8;

标签: c# encoding utf-8 cp1252


【解决方案1】:
var myGoodString = System.IO.File.ReadAllText(
    @"C:\path\to\file.txt",
    Encoding.GetEncoding("Windows-1252")
    );

内存中的 .NET/CLRstring 不能是 UTF-8。它只是 Unicode,如果你愿意,也可以是 UTF-16。

上面的代码会正确地将CP1252中的一个文本文件读入一个.NET string

如果你坚持要通过byte[] wind1252Bytes,那很简单:

var myGoodString = Encoding.GetEncoding("Windows-1252").GetString(wind1252Bytes);

自从编写此答案以来,已经出现了新版本的框架 .NET,默认情况下它不能识别所有旧的(遗留)Windows 特定代码页。如果Encoding.GetEncoding("Windows-1252") 在您的运行时版本中引发异常,请尝试使用

注册其他提供程序
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

(可能需要对System.Text.Encoding.CodePages.dll 的额外程序集引用)在使用Encoding.GetEncoding("Windows-1252") 之前。

CodePagesEncodingProvider class documentation

【讨论】:

  • 在我的机器上,Encoding.GetEncoding("Windows-1252") 抛出: System.ArgumentException: 'Windows-1252' is not a supported encoding name。有关定义自定义编码的信息,请参阅 Encoding.RegisterProvider 方法的文档。 (参数“名称”)
  • 啊,我发现.NET Core不支持Windows-1252:docs.microsoft.com/en-us/dotnet/api/…
  • @Froggy 在 Windows 特定的“代码页 1252”不可用的系统上,相关(但不完全相同)编码是您可以使用 @987654334 获得的 ISO“Latin 1” @.
  • @Froggy 见上文,可以注册一个新的编码提供者。
  • @KarlStephen 查看上面的新信息。
猜你喜欢
  • 2011-08-09
  • 2011-08-27
  • 2019-11-03
  • 2020-11-29
  • 2014-01-18
  • 2012-09-11
  • 2016-05-16
  • 2011-08-16
相关资源
最近更新 更多