【发布时间】:2020-09-15 10:56:08
【问题描述】:
我正在获取可以是 latin1 或 utf8 编码的文件。我将它作为 C# 中的流获取。如何检测它的 latin1 ("ISO-8859-1") 还是 UTF-8?当我尝试检测它时,它总是会将其检测为 UTF-8。 此代码不起作用,如果始终为 UTF-8。
private Encoding GetUtf8EncodeStream(Stream fileStream)
{
using var reader = new StreamReader(fileStream, true);
var encoding = reader.CurrentEncoding;
if (Equals(encoding, Encoding.UTF8))
{
return Encoding.UTF8;
}
return Encoding.GetEncoding("ISO-8859-1");
}
void Method(){
var encoding = GetUtf8EncodeStream(fileStream);
using (TextReader reader = new StreamReader(fileStream, encoding))
}
我首先需要知道编码,然后我将使用该编码读取它。
我需要知道编码,因为它有特殊字符 æ、ø 和 å。如果我尝试读取具有编码:latin1 的流并将流读取器设置为 UTF-8,则会出现问号而不是字符。如果我在我将 StreamWriter 设置为编码 UTF-8 的位置进行反转,并且它在 latin1 中,那么地狱将会失败;)
【问题讨论】:
-
您正在检查的流是否包含 7 位 ASCII 范围之外的任何字符?如果不是,它可能会因此被检测为 UTF8(我会假设)。
-
是的,它有一些字符 æ、ø 和 å。更新了我的问题。 :)
-
您可以尝试验证该文件是否为有效的utf8。否则,恐怕没有算法可以检测编码。如果启用错误检测,
UTF8Encoding.GetString(byteArray)会抛出ArgumentException。 -
"在有效多字节序列之外存在无效的 8 位字符也可用于“自动检测”编码实际上是扩展的 ASCII 编码而不是 UTF-8,并进行解码相应地。”见Wikipedia
标签: c# encoding utf-8 iso-8859-1 utf8mb4