如何检查文件编码是否正确(对应于国家/编码页)

本文关键字:编码 于国家 国家 是否 何检查 检查 文件 | 更新日期: 2023-09-27 18:18:47

如何检查文本文件,如果它只包含有效字符,对应于国家代码页?

因为它们被转移到linux系统中,所以每个字符都必须在代码页

通过谷歌搜索,我找不到任何有用的

是否有一种"干净"的方法来检查这个,或者只有"肮脏"(静态)的方法来检查这个?

Update:情况是这样的,我必须检查包含应用程序翻译的资源文件。这些文件是在不同的国家翻译的,所以很容易出现输入错误的字符,然后应用程序无法正确显示它。Windows总是搜索几乎相同的字符,但linux不会。

如何检查文件编码是否正确(对应于国家/编码页)

你说"假设文件带有UTF-8"。

在这种情况下,假设您可以将文件读入c#字符串或字符串数组。

例如,如果你有一个byte[]数组,你可以像这样转换为c# UTF16字符串:

var text = Encoding.UTF8.GetString(utf8Bytes);

或者你可以(使用UTF8编码)直接从文件读入c#字符串。让我们假设你可以自己做这一点。

现在-给定您有一个c#字符串-您可以使用Encoding.GetEncoding()与代码页参数和EncoderExceptionFallbackDecoderExceptionFallback来检查字符串是否在该特定代码页中有效,如下所示:

public static bool IsStringValidForCodePage(string text, int codePage)
{
    var encoder = Encoding.GetEncoding(codePage, new EncoderExceptionFallback(), new DecoderExceptionFallback());
    try
    {
        encoder.GetBytes(text);
    }
    catch (EncoderFallbackException)
    {
        return false;
    }
    return true;
}

下面的示例使用希腊圆周率字符"π",它在代码页1253(希腊语)中有效,在代码页1252(拉丁语1)中无效。

string pi = "π"; // Mmmm. I like pi.
if (IsStringValidForCodePage(pi, 1252))
    Console.WriteLine("Pi is ok in 1252");
else
    Console.WriteLine("Pi is NOT ok in 1252"); // Prints NOT ok.
if (IsStringValidForCodePage(pi, 1253))
    Console.WriteLine("Pi is ok in 1253");  // Prints ok.
else
    Console.WriteLine("Pi is NOT ok in 1253");

如果您可以让翻译器提供UTF-8文本,则可以使用程序将其转换为所需的代码页。将字符串加载到内存中,创建目标Encoding的实例,然后调用Encoding。GetBytes将字符串转换为适当的字节序列。阅读那里的文档和有关字符编码的链接文章,学习如何检测和处理翻译错误。

回复评论的更新:

如果您设置了编码器。属性,则只要在转换字符时出现错误,就会调用该方法。因此,如果调用Encoder.Fallback方法,则存在转换错误。这意味着您不必手动检查转换后的文本。

字符集转换可能是一个难题。我强烈建议您阅读。net框架中的字符编码。