зеркало из https://github.com/softlandia/cpd.git
v0.2.5
This commit is contained in:
Родитель
e1fbd8535e
Коммит
7407e12332
|
@ -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
|
||||
|
|
19
ibm866.go
19
ibm866.go
|
@ -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
|
||||
|
|
18
utf32be.go
18
utf32be.go
|
@ -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
|
||||
|
||||
}
|
||||
|
|
21
utf32le.go
21
utf32le.go
|
@ -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
|
||||
}
|
||||
|
|
2
utf8.go
2
utf8.go
|
@ -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]))
|
||||
|
|
Загрузка…
Ссылка в новой задаче