This commit is contained in:
softlandia 2020-01-04 05:32:22 +04:00
Родитель 0fc512aae0
Коммит 9c2bbb0422
6 изменённых файлов: 32 добавлений и 53 удалений

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

@ -23,16 +23,3 @@ func CheckBOM(buf []byte) (id IDCodePage, res bool) {
}
return ASCII, false
}
/*func bomUTF8(b []byte) bool {
return (len(b) > 3) && (b[0] == 0xEF) && (b[1] == 0xBB) && (b[2] == 0xBF)
}
func bomUTF16le(b []byte) bool {
return (len(b) > 2) && (b[0] == 0xFF) && (b[1] == 0xFE)
}
func bomUTF16be(b []byte) bool {
return (len(b) > 2) && (b[0] == 0xFE) && (b[1] == 0xFF)
}
*/

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

@ -19,6 +19,7 @@ func (t *codePageTable) clear() {
}
}
// founded - calculates total number of matching
func (t *codePageTable) founded() (res int) {
//0 элемент исключён, он не содержит количество найденных букв
for i := 1; i < len(t); i++ {

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

@ -1,7 +1,3 @@
// file from "golang.org\x\text\encoding\internal\identifier" (c) golang autors
// contain identifier of code page
// IDCodePage implements interface String()
package cpd
import (
@ -9,31 +5,31 @@ import (
"strings"
)
//IDCodePage - index of code page
// IDCodePage - index of code page
// implements interface String()
type IDCodePage uint16
func (i IDCodePage) String() string {
return codePageName[i]
}
//itRuneMatch - return 1 if rune from this code page, 0 else
// function exist in every CodePage
//type itRuneMatch func(r rune, tbl *codePageTable) int
//runesMatch - return count of entry elements of data to code page
type runesMatch func(data []byte, tbl *codePageTable) MatchRes
// matcher - return struct MatchRes - two criterion
// this function must be realised in each code page
type matcher func(data []byte, tbl *codePageTable) MatchRes
type tableElement struct {
code rune //руна которая нас интересует, она присутствует в этой кодовой таблице как буква алфавита
count int //количество вхождений данной руны
code rune //rune (letter) of the alphabet that interests us
count int //the number of these runes found in the text
}
// codePageTable - содержит основные (наиболее часто встречаемые) символы алфавита в данной кодировке
// первые 9 прописные, 2-я девятка заглавные
// codePageTable - stores 9 letters, we will look for them in the text
// element with index 0 for the case of non-location
// first 9 elements lowercase, second 9 elements uppercase
type codePageTable [19]tableElement
// MatchRes - итоговый критерий совпадения массива данных с кодовой страницей
// возможно в дальнейшем усложнится
// MatchRes - result criteria
// countMatch - the number of letters founded in text
// countCvPairs - then number of pairs consonans+vowels
type MatchRes struct {
countMatch int
countCvPairs int
@ -43,12 +39,12 @@ func (m MatchRes) String() string {
return fmt.Sprintf("%d, %d", m.countMatch, m.countCvPairs)
}
// CodePage - содержит данные по конкретной кодовой странице
// CodePage - realize code page
type CodePage struct {
id IDCodePage //id of code page
name string //name of code page
MatchRes //count of matching
match runesMatch //method to calculate from input data count of entry to codepage
match matcher //method for calculating the criteria for the proximity of input data to this code page
table codePageTable //table of main alphabet rune of this code page, contain [code, count]
}
@ -68,7 +64,7 @@ func (o CodePage) MatchingRunes() string {
return sb.String()
}
//TCodepagesDic - type to store all supported code page
// TCodepagesDic - type to store all supported code page
type TCodepagesDic map[IDCodePage]CodePage
//CodepageDic -
@ -131,12 +127,11 @@ var CodepageDic = TCodepagesDic{
{0x0, 0}, {0x0, 0}, {0x0, 0}, {0x0, 0}, {0x0, 0}, {0x0, 0}, {0x0, 0}, {0x0, 0}, {0x0, 0}}},
}
//если кодировка файла определяется по BOM или по внутренней структуре,
//то счётчики совпадений будут заполнены не корректно
//обнуляем счётчики
//befor detecting of code page need clear all counts
//this not for correct run, this need only if we want get correct statistic
func (o TCodepagesDic) clear() {
for id, cp := range o {
cp.countMatch = 0
cp.MatchRes = MatchRes{0, 0}
cp.table.clear()
o[id] = cp
}

7
cpd.go
Просмотреть файл

@ -1,5 +1,5 @@
//Package cpd - code page detect
// (c) 2019 softlandia@gmail.com
// (c) 2020 softlandia@gmail.com
package cpd
import (
@ -34,7 +34,6 @@ func FileCodePageDetect(fn string, stopStr ...string) (IDCodePage, error) {
//CodePageDetect - detect code page of ascii data from reader 'r'
func CodePageDetect(r io.Reader, stopStr ...string) (IDCodePage, error) {
//initial test
//test input interfase
if !reflect.ValueOf(r).IsValid() {
return ASCII, fmt.Errorf("input reader is nil")
@ -46,8 +45,8 @@ func CodePageDetect(r io.Reader, stopStr ...string) (IDCodePage, error) {
return ASCII, err
}
//возможно определение произойдёт по BOM или по валидности UTF тогда количество попаданий по кодовым страницам лучше занулить
//на работу это повлиять не может, но если вывести статистику попаданий, то увидим цифры с предыдущего определения.
//clear all counts and matching result
//CodepageDic - global var and need cleaning befor reuse
CodepageDic.clear()
//match code page from BOM, support: utf-8, utf-16le, utf-16be, utf-32le or utf-32be

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

@ -2,20 +2,17 @@ package cpd
//unit for ibm866
//tbl - массив структур (19 штук), 18 рабочих, нулевой элемент технический
//каждая структура состоит из искомого символа и счётчика
//для CP866 достаточно только вычисления счётчика по базовому алгоритму:
//подсчитываем случаи когда нужные нам буквы просто встречаются
// for CP866 calculate only count of letter from table 'tbl'
func match866(data []byte, tbl *codePageTable) MatchRes {
matches := 0
// matches := 0
for i := range data {
j := tbl.index(rune(data[i])) //получили номер символа в таблице
j := tbl.index(rune(data[i])) //return 0 if rune data[i] not found
(*tbl)[j].count++
if j > 0 {
matches++
}
/* if j > 0 {
matches++
}*/
}
return MatchRes{matches, 0}
return MatchRes{tbl.founded(), 0}
}
const (

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

@ -42,7 +42,7 @@ var vowels1251 = [256]byte{
/* F */ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x01,
}
// cvPairs1251 - подсчитывает количество пар СОГЛАСНАЯ+ГЛАСНАЯ в кодировке CP1251
// cvPairs1251 - counts the number of pairs consonans+vowels
func cvPairs1251(d []byte) (cvPairsCount int) {
for i := 0; i < len(d)-1; i++ {
if consonans1251[d[i]] > 0 {
@ -55,7 +55,7 @@ func cvPairs1251(d []byte) (cvPairsCount int) {
return cvPairsCount
}
// matchRunes1251 - подсчитывает количество символов соответствующих популярным буквам русского алфавита
// matchRunes1251 - counts the number of characters that are the most popular letters of the Russian alphabet
func matchRune1251(d []byte, tbl *codePageTable) int {
for i := 0; i < len(d); i++ {
if is1251(d[i]) {