【问题标题】:C#: bytes to UTF-8 string conversion. Why doesn't it work?C#:字节到 UTF-8 字符串的转换。为什么它不起作用?
【发布时间】:2013-02-18 19:44:36
【问题描述】:

有一个汉字???在 UTF-8 中显示为 F0 A4 AD A2。这个角色在这里描述:http://en.wikipedia.org/wiki/UTF-8

???? U+24B62 F0 A4 AD A2

当我在 C# 中运行此代码时...

byte[] data = { 0xF0, 0xA4, 0xAD, 0xA2 };
string abc = Encoding.UTF8.GetString(data);
Console.WriteLine("Test: description = {0}", abc);

... 我将输出重定向到文本文件,然后使用 notepad.exe 选择 UTF-8 编码打开它。我希望得到????在输出中,但确实得到两个问号 (??)。

字节序列是正确的。 在 Perl 中工作

print "\xF0\xA4\xAD\xA2";

在输出中,我得到 ??????

所以我的问题是:为什么我会得到“??”代替 ”????”在 C# 中?

附:这个字符没有什么特别之处:我对任何字符(2、3 或 4 字节长)都得到了相同的结果。

【问题讨论】:

  • 在 Perl 的情况下,“在输出中”是指将输出重定向到文本文件并用记事本打开吗?
  • 您需要确保使用 UTF8 编码写入文件。您可以发布写入文件的代码吗?
  • 您不能使用文件的任何特殊原因?控制台和 Unicode 处理起来有些痛苦。在这种情况下,Oleksandr Pshenychnyy 的回答 (+1) 可能会对您有所帮助...
  • @JakobChristensen 根据“将输出重定向到文本文件”没有写入文件的代码。检查文件的实际内容也是一个好点。
  • @AlexeiLevenkov:你是对的。我误读了这个问题。

标签: c# encoding utf-8 character-encoding hex


【解决方案1】:

默认情况下,控制台无法显示 Unicode 字符。它只显示 ASCII。要使其显示 Unicode,请使用:

Console.OutputEncoding = System.Text.Encoding.Unicode

在写之前。

但是无论如何它在大多数操作系统上都会失败,因为 Windows 命令行本身不支持 Unicode。

因此,出于测试目的最好将输出写入文件

【讨论】:

  • 如果可以在控制台应用程序上设置编码,则应该可以在启动命令提示符时设置编码。我不同意输出当然应该被重定向到一个文件。
  • 此命令产生异常:通用异常处理程序:System.IO.IOException:参数不正确。在 System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) 在 System.IO.__Error.WinIOError() 在 System.Console.set_OutputEncoding(编码值) 在 tpam_multibyte.Program.Main(String[] args)
  • 正如我所说,它会在 Windows 操作系统上失败(至少到 Windows 7),因为 Windows 控制台不支持 unicode。这就是您收到该错误的原因
  • 请把帖子读到最后。推荐的解决方案是写入文件,而不是控制台。顺便说一句,如果需要,您可以将该解决方案与其他编码一起使用(但目前您可能不需要)
  • @Oleksandr Pshenychnyy:Windows 控制台确实支持 Unicode。为了让您相信安​​装 Far Manager 并将其与 Consolas 字体一起使用。
【解决方案2】:

您需要使用 UTF8 写入文件。下面的代码显示了您可以如何做到这一点。在记事本中打开生成的文件时,字符 ? 正确显示:

string c = "?";
var bytes = Encoding.UTF8.GetBytes(c);
var cBack = Encoding.UTF8.GetString(bytes);
using (var writer = new StreamWriter(@"c:\temp\char.txt", false, Encoding.UTF8))
{
    writer.WriteLine(cBack);
}

【讨论】:

  • @Racoon:很高兴我能帮上忙 :-)
  • 如何用控制台做到这一点?
  • @Paul 如果您正在考虑使用控制台做同样的事情,您需要使用“chcp”命令将控制台代码页更改为 UTF-8 等效代码页(例如chcp 65001 for utf-8) 然后运行应用程序二进制文件并将标准输出重定向到文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-03
相关资源
最近更新 更多