扫描文件的字符编码,不输出文件 扫描多少行scanLineNum 默认100 如果是-1 之前全部扫描
| 986 | //扫描多少行scanLineNum 默认100 |
| 987 | //如果是-1 之前全部扫描 |
| 988 | CODE_ID CmpareMode::scanFileRealCode(QString filePath, int scanLineNum) |
| 989 | { |
| 990 | QFile file(filePath); |
| 991 | file.open(QIODevice::ReadOnly); |
| 992 | |
| 993 | CODE_ID code = CODE_ID::UNKOWN; |
| 994 | int lineNums = 0; |
| 995 | |
| 996 | bool isExistGbk = false; |
| 997 | bool isExistUnKownCode = false; |
| 998 | bool isExistUtf8 = false; |
| 999 | |
| 1000 | |
| 1001 | while (!file.atEnd()) { |
| 1002 | |
| 1003 | LineFileInfo lineInfo; |
| 1004 | |
| 1005 | QByteArray line = file.readLine(); |
| 1006 | |
| 1007 | lineInfo.lineNums = lineNums; |
| 1008 | |
| 1009 | /* 这种方式读取文件会包含后面的行尾 */ |
| 1010 | //int length = line.length(); |
| 1011 | |
| 1012 | //第一行时,检测一下文件编码,返回值也是文件的编码 |
| 1013 | if (0 == lineNums) |
| 1014 | { |
| 1015 | recognizeTextCode(line, lineInfo, lineInfo.unicodeStr); |
| 1016 | code = (CODE_ID)lineInfo.code; |
| 1017 | |
| 1018 | //已经找到文本的标签,相信标签,之前返回 |
| 1019 | if (code == CODE_ID::UNICODE_BE || code == CODE_ID::UNICODE_LE || code == CODE_ID::UTF8_BOM || code == CODE_ID::GBK) |
| 1020 | { |
| 1021 | break; |
| 1022 | } |
| 1023 | |
| 1024 | } |
| 1025 | else |
| 1026 | { |
| 1027 | /*对于头部没有标识的行,需要每行进行详细检查,比较耗时 |
| 1028 | *对于第一行已经是GBK的编码,标识出所有的确是GBK的行号 |
| 1029 | *严格来说,如果以后要做国际版,不应该只考虑GBK,而是要考虑本地ASNI编码。 |
| 1030 | *对中国而言,本地ASNI编码是GBK,对其它国家,比如日本/韩国而言,这些ASNI是它们本国 |
| 1031 | *对应的本地编码。 |
| 1032 | */ |
| 1033 | recognizeTextCode(line, lineInfo, lineInfo.unicodeStr); |
| 1034 | |
| 1035 | if (CODE_ID::UTF8_NOBOM == lineInfo.code) |
| 1036 | { |
| 1037 | isExistUtf8 = true; |
| 1038 | } |
| 1039 | else if (CODE_ID::GBK == lineInfo.code) |
| 1040 | { |
| 1041 | //如果发现存在GBK,则要以GBK作为字符编码。这里识别gbk是因为显示的时候,需要转化gbk进行显示 |
| 1042 | isExistGbk = true; |
| 1043 | } |
| 1044 | else if (CODE_ID::UNKOWN == lineInfo.code) |
| 1045 | { |