通过检查输入字节来确定输入编码

时间:2010-01-13 14:36:21

标签: c++ encoding utf-8 console

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

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

5 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分: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);
}

您既可以使用它,也可以查看它们的来源。

答案 2 :(得分:0)

使用内置操作系统手段。这些因操作系统而异。在Windows上,使用WideChar API总是更好,而根本不考虑编码。

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

答案 3 :(得分:0)

Jared Oberhaus对特定于java的related question做了很好的回答。

基本上你可以采取一些步骤来做出合理的猜测,但最终只是在没有明确指示的情况下猜测。 (因此UTF-8文件中的(in)着名BOM标记)

答案 4 :(得分:0)

正如已经在回应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。