在C+中可以使用什么字符集检测器来检测未知网页编码+;应用 我使用C++,QT4.85,Visual Studio 2010。我想创建Windows GUI应用程序来下载一些网页。请注意,我的程序是以32位模式构建的,应该在32位和64位Windows环境中运行。我不需要使用Qt-webkit。我需要分析网页。但问题是字符编码。在缺少字符集信息的情况下,可以使用什么字符集自动检测C/C++库?无法使用MLang,因为它是基于COM的。不需要极高的检测精度。我更喜欢简单的API和简单的Windows友好的构建说明。

在C+中可以使用什么字符集检测器来检测未知网页编码+;应用 我使用C++,QT4.85,Visual Studio 2010。我想创建Windows GUI应用程序来下载一些网页。请注意,我的程序是以32位模式构建的,应该在32位和64位Windows环境中运行。我不需要使用Qt-webkit。我需要分析网页。但问题是字符编码。在缺少字符集信息的情况下,可以使用什么字符集自动检测C/C++库?无法使用MLang,因为它是基于COM的。不需要极高的检测精度。我更喜欢简单的API和简单的Windows友好的构建说明。,c++,qt,character-encoding,C++,Qt,Character Encoding,当没有关于编码的信息时,唯一的方法是使用多种编码转换数据并选择最佳结果。对结果的评估取决于你的目标。例如,该函数尝试在CP1251和UTF-8编码之间进行选择,假设数据表示俄语文本: QString detect_encoding(const QByteArray &array) { QString alphabet = QString::fromUtf8("АаБбВвГгДдЕеЁёЖжЗзИиЙйКкЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЩщЪъЫыЬьЭэЮ

当没有关于编码的信息时,唯一的方法是使用多种编码转换数据并选择最佳结果。对结果的评估取决于你的目标。例如,该函数尝试在CP1251和UTF-8编码之间进行选择,假设数据表示俄语文本:

QString detect_encoding(const QByteArray &array) {
  QString alphabet = QString::fromUtf8("АаБбВвГгДдЕеЁёЖжЗзИиЙйКкЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЩщЪъЫыЬьЭэЮюЯя");
  QString try_utf = QString::fromUtf8(array);
  QString try_win = QTextCodec::codecForName("cp1251")->
    toUnicode(try_utf.toLatin1());
  int count_utf = 0, count_win = 0;
  for(int i = 0; i < try_utf.length(); i++) {
    if (alphabet.contains(try_utf[i])) {
      count_utf++;
    }
  }
  for(int i = 0; i < try_win.length(); i++) {
    if (alphabet.contains(try_win[i])) {
      count_win++;
    }
  }
  if (count_win > count_utf) {
    return try_win;
  } else {
    return try_utf;
  }
}
QString检测编码(常量QByteArray和数组){
字符串字母=字符串::来自UTF8(“АаааааааааааааааааааааааПааааааСаааа;
QString try\u utf=QString::fromUtf8(数组);
QString try_win=QTextCodec::codeforname(“cp1251”)->
toUnicode(try_utf.toLatin1());
int count\u utf=0,count\u win=0;
对于(int i=0;i计数utf){
回报你的努力;
}否则{
返回try_utf;
}
}
有相当多的编码,可以代表俄罗斯。您只需要将它们添加到比较中。同样的方法适用于任何语言或多种语言的组合,您只需更改字母表设置和编码。(我建议重构这个函数。在当前状态下,它只是一个说明,而不是一段生产代码。)


当没有特定的目标语言时,几乎不可能在没有编码信息的情况下解码数据。另外,任意页面可能包含一些特殊符号,这些符号可能会混淆检测器。没有通用的方法。我希望每个站点都使用UTF-8。

您可能需要使用一些HTTP客户端库,如,并了解更多有关该协议的信息,尤其是HTTP和HTML有一些描述编码的字段。您是否还想处理错误的情况?另外,请给出预期的输入和输出,以及您尝试过的内容,因此实际输出是什么。“极端准确”意味着存在正确的解决方案。这可能有点牵强,我的意思是HTTP和HTML有时不提供编码