зеркало из https://github.com/softlandia/cpd.git
v0.3.0 edit comment
This commit is contained in:
Родитель
0fc512aae0
Коммит
9c2bbb0422
13
CheckBom.go
13
CheckBom.go
|
@ -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
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
|
||||
|
|
17
ibm866.go
17
ibm866.go
|
@ -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]) {
|
||||
|
|
Загрузка…
Ссылка в новой задаче