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

时间:2013-06-17 12:55:05

标签: c# text encoding character-encoding codepages

如果txt文件只包含与国家/地区代码页相对应的有效字符,该如何检查?

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

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

有没有“干净”的方法来检查这个还是只有“脏”(静态)方法来做这个?

更新:这种情况是我必须检查包含应用程序翻译的资源文件。这些文件是在不同的国家翻译的,因此很容易发生输入错误的字符,以后应用程序无法正确显示它。 Windows总是搜索几乎相同的角色,但linux不会。这就是重点。

2 个答案:

答案 0 :(得分:2)

您说“假设文件附带UTF-8”。

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

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

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

或者您可以(使用UTF8编码)将其直接从文件读取到C#字符串中。让我们假设你自己可以做到这一点。

现在 - 假设您有一个C#字符串 - 您可以使用带有代码页参数的Encoding.GetEncoding()EncoderExceptionFallback以及DecoderExceptionFallback来检查字符串是否在该特定字符串中有效代码页,如下:

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;
}

以下示例使用希腊语Pi字符“π”,该字符在代码页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");

答案 1 :(得分:1)

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

更新以回复评论:

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

字符集转换可能是一个难题。我强烈建议您阅读文章Character Encoding in the .NET Framework