2

如果 txt 文件仅包含与国家代码页相对应的有效字符,我如何检查它?

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

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

是否有一种“干净”的方式来检查这一点,还是只有“肮脏”(静态)的方式来做到这一点?

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

4

2 回答 2

2

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

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

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

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

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

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

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");
于 2013-06-17T15:26:15.087 回答
1

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

更新以回应评论:

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

字符集转换可能是一个难题。我强烈建议您阅读.NET Framework 中的字符编码一文。

于 2013-06-17T13:39:10.487 回答