gint guess_kanji(gint imax, guchar *buf) { int i, bad_euc, bad_sjis; for (i = 0; i < imax; i++) { if(buf[i+5] == '\0') break; if((strncmp(&buf[i], JIS0208_1978, strlen(JIS0208_1978)) == 0) || (strncmp(&buf[i], JIS0208_1983, strlen(JIS0208_1983)) == 0) || (strncmp(&buf[i], JIS0208_1990, strlen(JIS0208_1990)) == 0) || (strncmp(&buf[i], JIS0212, strlen(JIS0212)) == 0) || (strncmp(&buf[i], JIS_ASC, strlen(JIS_ASC)) == 0) || (strncmp(&buf[i], JIS_ASC2, strlen(JIS_ASC2)) == 0) || (strncmp(&buf[i], JIS_KANA, strlen(JIS_KANA)) == 0)) return(KCODE_JIS); } bad_euc = 0; for (i = 0; i < imax; i++) { if(buf[i+2] == '\0') break; if (iseuc(buf[i]) && ++i < imax) { if (! iseuc(buf[i])) { bad_euc += 10; i--; } else if (buf[i-1] >= 0xd0) bad_euc++; /* Dai 2 Suijun */ /* 1999-02-01 bug fixed. Thanks: massangeana */ } else if (buf[i] == 0x8e && ++i < imax) { if (ishankana(buf[i])) bad_euc++; else { bad_euc += 10; i--; } } else if (buf[i] >= 0x80) bad_euc += 10; } bad_sjis = 0; for (i = 0; i < imax; i++) { if(buf[i+2] == '\0') break; if (issjis1(buf[i]) && ++i < imax) { if (! issjis2(buf[i])) { bad_sjis += 10; i--; } else if ((unsigned) (buf[i-1] * 256U + buf[i]) >= 0x989f) bad_sjis++; /* Dai 2 Suijun */ } else if (buf[i] >= 0x80) { if (ishankana(buf[i])) bad_sjis++; else bad_sjis += 10; } } if(bad_sjis < bad_euc) return(KCODE_SJIS); else if (bad_sjis > bad_euc) return(KCODE_EUC); else if ((bad_euc == 0) && (bad_sjis == 0)) return(KCODE_ASCII); else return(KCODE_UNKNOWN); }
Encoding GetEncoding(PCSTR str, size_t len) { size_t i; int ascii, eucjp, sjis, utf8, bad_eucjp, bad_sjis, bad_utf8; int jis, hankana; const unsigned char* buf = (const unsigned char*)str; ascii = 1; bad_eucjp = eucjp = 0; bad_sjis = sjis = 0; bad_utf8 = utf8 = 0; jis = 0; // check BOM if (len >= 2) { if (buf[0] == 0xff && buf[1] == 0xfe) return ENCODING_UTF16_LE; else if (buf[0] == 0xfe && buf[1] == 0xff) return ENCODING_UTF16_BE; } if (len >= 3 && !memcmp(buf, "\xef\xbb\xbf", 3)) return ENCODING_UTF8_BOM; // check ENCODING_SJIS hankana = 0; for (i = 0; i < len; i++) { if (buf[i] >= 0x80) ascii = 0; if (buf[i] == 0x1b) jis = 1; if (buf[i] == 0x8e && i + 2 < len && buf[i + 2] == 0x8e && ishankana(buf[i + 1])) { bad_sjis += 1; } if (ishankana(buf[i])) { sjis += 0x10/2 - 1; hankana++; } else { if (hankana == 1) bad_sjis++; hankana = 0; if (issjis1(buf[i])) { if (i + 1 < len) { if (issjis2(buf[i + 1])) { sjis += 0x10; i++; } else bad_sjis += 0x100; } } else if (buf[i] >= 0x80) bad_sjis += 0x100; } } if (ascii) return jis ? ENCODING_JIS : ENCODING_ASCII; // check ENCODING_EUCJP - JP hankana = 0; for (i = 0; i < len; i++) { if (buf[i] == 0x8e) { if (i + 1 < len) { if (ishankana(buf[i + 1])) { eucjp += 10; i++; hankana++; } else bad_eucjp += 0x100; } } else { if (hankana == 1) bad_eucjp++; hankana = 0; if (iseuc(buf[i])) { if (i + 1 < len) { if (iseuc(buf[i + 1])) { i++; eucjp += 0x10; } else bad_eucjp += 0x100; } } else if (buf[i] == 0x8f) { if (i + 2 < len) { if (iseuc(buf[i + 1]) && iseuc(buf[i + 2])) { i += 2; eucjp += 0x10; } else bad_eucjp += 100; } } else if (buf[i] >= 0x80) bad_eucjp += 0x100; } } // check UTF-8 for (i = 0; i < len; i++) { if (isutf8_2byte(buf[i])) { if (i + 1 < len) { if (isutf8_trail(buf[i + 1])) { utf8 += 10; i++; } else bad_utf8 += 100; } } else if (isutf8_3byte(buf[i])) { if (i + 2 < len) { if (isutf8_trail(buf[i + 1]) && isutf8_trail(buf[i + 2])) { utf8 += 15; i += 2; } else bad_utf8 += 1000; } } else if (buf[i] >= 0x80) bad_utf8 += 1000; } if (sjis - bad_sjis > eucjp - bad_eucjp) { if (sjis - bad_sjis > utf8 - bad_utf8) return ENCODING_SJIS; else if (sjis - bad_sjis < utf8 - bad_utf8) return ENCODING_UTF8; } if (sjis - bad_sjis < eucjp - bad_eucjp) { if (eucjp - bad_eucjp > utf8 - bad_utf8) return ENCODING_EUCJP; else if (eucjp - bad_eucjp < utf8 - bad_utf8) return ENCODING_UTF8; } return ENCODING_UNKNOWN; }