【问题标题】:Determine input encoding by examining the input bytes通过检查输入字节确定输入编码
【发布时间】:2010-01-13 14:36:21
【问题描述】:

我正在从用户那里获得控制台输入,并希望将其编码为 UTF-8。我的理解是 C++ 没有输入流的标准编码,而是取决于编译器、运行时环境、本地化等等。

如何通过检查输入的字节来确定输入编码?

【问题讨论】:

    标签: c++ encoding utf-8 console


    【解决方案1】:

    一般来说,你不能。如果我在您的应用程序中拍摄随机生成的字节流,它如何确定它们的“编码”?您只需指定您的应用程序接受某些编码,或者假设操作系统提供给您的内容将被适当编码。

    【讨论】:

    • 要以此为基础,您可以使用环境来确定合理的默认值。如果您的操作系统支持,请查看 $LANG 和 locale 命令。
    【解决方案2】:

    通常检查输入是否为 UTF 是一个启发式问题 - 没有明确的算法会告诉您“是/否”。启发式方法越复杂,得到的误报/负数就越少,但是没有“确定”的方法。

    有关启发式的示例,您可以查看此库:http://utfcpp.sourceforge.net/

    bool valid_utf8_file(iconst char* file_name)
    {
        ifstream ifs(file_name);
        if (!ifs)
            return false; // even better, throw here
    
        istreambuf_iterator<char> it(ifs.rdbuf());
        istreambuf_iterator<char> eos;
    
        return utf8::is_valid(it, eos);
    }
    

    您可以使用它,也可以查看它的来源他们是如何做到的。

    【讨论】:

    • 注意 - 这告诉你它是否可能是 utf8,你不知道它是否是。常规的 7 位 ASCII 流是 ​​utf8,直到您遇到第一个重音字符。
    • 检查输入是否是有效的 UTF-8 不是启发式的(这是您的函数所做的),而是确定 UTF-8 是否是用户的意图 是。
    【解决方案3】:

    使用内置操作系统的方式。这些因一个操作系统而异。在 Windows 上,最好使用 WideChar API 而根本不考虑编码。

    如果你的输入来自一个文件,而不是一个真正的控制台,那么所有的赌注都没有。

    【讨论】:

      【解决方案4】:

      Jared Oberhaus 在特定于 java 的 related question 上很好地回答了这个问题。

      基本上,您可以采取几个步骤来做出合理的猜测,但最终这只是猜测,没有明确的指示。 (因此在 UTF-8 文件中 (in) 著名的 BOM 标记)

      【讨论】:

        【解决方案5】:

        正如在回复question John Weldon has pointed to 时已经说过的那样,有许多库可以进行字符编码识别。你也可以看看 unix file 命令的源代码,并查看它使用哪些测试来确定文件编码。来自file的手册页:

        ASCII、ISO-8859-x、非 ISO 8 位扩展 ASCII 字符集(例如用于 Macintosh 和 IBM PC 系统的字符集)、UTF-8 编码的 Unicode、UTF-16 编码的 Unicode 和EBCDIC 字符集可以通过构成每个集中可打印文本的不同范围和字节序列来区分。

        PCRE 提供了一个函数来测试给定字符串是否完全是有效的 UTF-8。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-07-24
          • 1970-01-01
          • 2015-02-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多