This commit is contained in:
softlandia 2019-12-21 17:48:59 +04:00
Родитель e1fbd8535e
Коммит 7407e12332
7 изменённых файлов: 27 добавлений и 38 удалений

Просмотреть файл

@ -4,6 +4,7 @@ package cpd
//return index of rune in code page table
//return 0 if rune not in code page table
//TODO надо переименовать, сейчас звучит как метод возвращающий true/false, должно быть типа index()
func (t *codePageTable) containsRune(r rune) int {
for j, e := range *t {
if r == e.code {

Просмотреть файл

@ -56,6 +56,7 @@ func (o CodePage) String() string {
}
//MatchingRunes - return string with rune/counts
//TODO Проанализировать вывод cp.MatchingRunes() приводимые счётчики не соответствуют итоговому, ИТОГОВЫЙ = 0, а в счётчиках каша
func (o CodePage) MatchingRunes() string {
var sb strings.Builder
fmt.Fprint(&sb, "rune/counts: ")
@ -81,7 +82,6 @@ func (o TCodepagesDic) clearMatchCount() {
}
//Match - return the id of code page to which the data best matches
//TODO для CP1251 и KOI8-r нужни убирать случаи "рУ" маленькая+большая. В одной кодировке это "ру" а в другой "Пс"
func (o TCodepagesDic) Match(data []byte) (result IDCodePage) {
result = ASCII
maxCount := 0

Просмотреть файл

@ -5,18 +5,15 @@ package cpd
//tbl - массив структур (19 штук), 18 рабочих, нулевой элемент технический
//каждая структура состоит из искомого символа и счётчика
//для CP866 достаточно только вычисления счётчика по базовому алгоритму:
//подсчитываем случи когда нужные нам буквы встречаются подряд
func runesMatch866(data []byte, tbl *codePageTable) (counts int) {
//подсчитываем случаи когда нужные нам буквы просто встречаются
//TODO возможно стоит вынести (*tbl)[j].count++ из if поскольку даже если символ не найден, то увеличить счётчик с индексом 0 можно. зато читаемость улучшится
//тем более нулевой элемент таблицы мы ведь завели, собственно для этого
func runesMatch866(data []byte, tbl *codePageTable) (foundedCounts int) {
for i := range data {
if i == 0 {
continue
}
if tbl.containsRune(rune(data[i-1])) > 0 {
j := tbl.containsRune(rune(data[i]))
if j > 0 {
(*tbl)[j].count++
counts++
}
j := tbl.containsRune(rune(data[i])) //получили номер символа в таблице
(*tbl)[j].count++
if j > 0 {
foundedCounts++
}
}
return

Просмотреть файл

@ -3,19 +3,15 @@ package cpd
//UTF-32BE
//первые 2 байта практически всегда меньше вторых 2 байтов
func runesMatchUTF32BE(d []byte, tbl *codePageTable) (counts int) {
var (
w1 int64
w2 int64
)
func runesMatchUTF32BE(d []byte, tbl *codePageTable) (zerroCounts int) {
for i := 0; i < len(d)-4; i += 4 {
w1 = int64(d[i]) * int64(d[i+1])
w2 = int64(d[i+2]) * int64(d[i+3])
if w1 > w2 {
counts = 0
break
if (int(d[i]) + int(d[i+1])) == 0 {
zerroCounts++
}
counts++
}
if zerroCounts*2 < len(d)/4 { //количество байтов в файле UTF-32 со значением 0 должно быть больше половины
return 0
}
return
}

Просмотреть файл

@ -2,21 +2,16 @@ package cpd
//UTF-32LE
//первые 2 байта практически всегда больше вторых 2 байтов
//TODO лучше попробовать оценить количество 0x0 байтов по отношению к общему и если их много, то только тогла определять LE/BE
func runesMatchUTF32LE(d []byte, tbl *codePageTable) (counts int) {
var (
w1 int64
w2 int64
)
//вторые 2 байта практически всегда 0
//используемый признак не сработает если больше половины текста будет набрано символами с 4 значащими байтами, не представляю, что это за текст...
func runesMatchUTF32LE(d []byte, tbl *codePageTable) (zerroCounts int) {
for i := 0; i < len(d)-4; i += 4 {
w1 = int64(d[i]) * int64(d[i+1])
w2 = int64(d[i+2]) * int64(d[i+3])
if w1 < w2 {
counts = 0 //все первые должны быть больше, иначе это не UTF-32le
break
if (int(d[i+2]) + int(d[i+3])) == 0 {
zerroCounts++
}
counts++
}
if zerroCounts*2 < len(d)/4 { //количество байтов в файле UTF-32 со значением 0 должно быть больше половины
return 0
}
return
}

Просмотреть файл

@ -3,7 +3,7 @@ package cpd
import "encoding/binary"
//unit for UTF8
//TODO на файле win1251_upper.txt выдаёт два попадания! Там вообще попаданий быть не должно!
func runesMatchUTF8(d []byte, tbl *codePageTable) (counts int) {
if len(d) <= 3 {
return

Просмотреть файл

@ -21,7 +21,7 @@ func runesMatch1251(data []byte, tbl *codePageTable) (counts int) {
if i < 2 {
continue
}
//case " Us" or ".Us" separator_UPPER_lower
//case " Us" separator_UPPER_lower
//IsPunct -
if (unicode.IsPunct(rune(data[i-2])) || unicode.IsSpace(rune(data[i-2]))) && isUpper1251(rune(data[i-1])) {
j := tbl.containsRune(rune(data[i]))