【问题标题】:How to read byte[] with current encoding using streamreader如何使用 streamreader 以当前编码读取字节 []
【发布时间】:2015-12-05 08:30:11
【问题描述】:

我想使用 C# 和文件的当前编码读取 byte[]

正如 MSDN 中所写,当构造函数没有编码时,默认编码将是 UTF-8:

var reader = new StreamReader(new MemoryStream(data)).

我也试过这个,但仍然以 UTF-8 格式获取文件:

var reader = new StreamReader(new MemoryStream(data),true)

我需要用当前编码读取byte[]

【问题讨论】:

标签: c# .net encoding stream streamreader


【解决方案1】:

文件没有编码。字节数组没有编码。一个字节没有编码。编码是将字节转换为文本,反之亦然。

您在文本编辑器等中看到的实际上是程序魔法:编辑器尝试不同的编码,然后猜测哪个最有意义。这也是您使用布尔参数启用的功能。如果这不能产生你想要的结果,那么这个魔法就失败了。

var reader = new StreamReader(new MemoryStream(data), Encoding.Default);

将使用特定于操作系统/位置的默认编码。如果这仍然不是您想要的,那么您需要完全明确,并告诉流阅读器使用什么确切的编码,例如(例如,您说您不想要 UTF8):

var reader = new StreamReader(new MemoryStream(data), Encoding.UTF8);

【讨论】:

  • 我再次检查了我们在 Web 服务调用中究竟得到了什么,它是 byte[]。正如我从答案中了解到的那样,我不知道数据的编码。然后我需要检查文件是否包含 bom 或变音符号,以便选择正确的编码。(utf-8、utf-8 和 bom 或 1252)。谢谢大家的回答。
【解决方案2】:

我只是尝试利用不同的方式来尝试找出 ByteEncoding,但这是不可能的,因为正如 Jan 在他的回复中提到的那样,字节数组没有适当的编码。但是,您始终可以获取该值并将类型转换为 UTF8 或 ASCII/Unicode 并测试字符串值,以防您正在执行“Text.EncodingFormat.GetString(byte [] array)”

public static bool IsUnicode(string input)    
{    
    var asciiBytesCount = Encoding.ASCII.GetByteCount(input);
    var unicodBytesCount = Encoding.UTF8.GetByteCount(input);
    return asciiBytesCount != unicodBytesCount;
}

【讨论】:

    猜你喜欢
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-20
    • 1970-01-01
    相关资源
    最近更新 更多