golden hour
/opt/cloudlinux/venv/lib/python3.11/site-packages/chardet
⬆️ Go Up
Upload
File/Folder
Size
Actions
__init__.py
4.68 KB
Del
OK
__main__.py
123 B
Del
OK
__pycache__
-
Del
OK
big5freq.py
30.54 KB
Del
OK
big5prober.py
1.72 KB
Del
OK
chardistribution.py
9.8 KB
Del
OK
charsetgroupprober.py
3.82 KB
Del
OK
charsetprober.py
5.29 KB
Del
OK
cli
-
Del
OK
codingstatemachine.py
3.64 KB
Del
OK
codingstatemachinedict.py
542 B
Del
OK
cp949prober.py
1.82 KB
Del
OK
enums.py
1.64 KB
Del
OK
escprober.py
3.91 KB
Del
OK
escsm.py
11.89 KB
Del
OK
eucjpprober.py
3.84 KB
Del
OK
euckrfreq.py
13.25 KB
Del
OK
euckrprober.py
1.71 KB
Del
OK
euctwfreq.py
36.05 KB
Del
OK
euctwprober.py
1.71 KB
Del
OK
gb2312freq.py
20.25 KB
Del
OK
gb2312prober.py
1.72 KB
Del
OK
hebrewprober.py
14.2 KB
Del
OK
jisfreq.py
25.19 KB
Del
OK
johabfreq.py
41.5 KB
Del
OK
johabprober.py
1.71 KB
Del
OK
jpcntx.py
26.42 KB
Del
OK
langbulgarianmodel.py
102.1 KB
Del
OK
langgreekmodel.py
96.16 KB
Del
OK
langhebrewmodel.py
95.88 KB
Del
OK
langhungarianmodel.py
98.98 KB
Del
OK
langrussianmodel.py
125.02 KB
Del
OK
langthaimodel.py
100.35 KB
Del
OK
langturkishmodel.py
93.13 KB
Del
OK
latin1prober.py
5.25 KB
Del
OK
macromanprober.py
5.93 KB
Del
OK
mbcharsetprober.py
3.63 KB
Del
OK
mbcsgroupprober.py
2.08 KB
Del
OK
mbcssm.py
29.68 KB
Del
OK
metadata
-
Del
OK
py.typed
0 B
Del
OK
resultdict.py
402 B
Del
OK
sbcharsetprober.py
6.25 KB
Del
OK
sbcsgroupprober.py
4.04 KB
Del
OK
sjisprober.py
3.91 KB
Del
OK
universaldetector.py
14.5 KB
Del
OK
utf1632prober.py
8.31 KB
Del
OK
utf8prober.py
2.75 KB
Del
OK
version.py
244 B
Del
OK
Edit: chardistribution.py
######################## BEGIN LICENSE BLOCK ######################## # The Original Code is Mozilla Communicator client code. # # The Initial Developer of the Original Code is # Netscape Communications Corporation. # Portions created by the Initial Developer are Copyright (C) 1998 # the Initial Developer. All Rights Reserved. # # Contributor(s): # Mark Pilgrim - port to Python # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA # 02110-1301 USA ######################### END LICENSE BLOCK ######################### from typing import Tuple, Union from .big5freq import ( BIG5_CHAR_TO_FREQ_ORDER, BIG5_TABLE_SIZE, BIG5_TYPICAL_DISTRIBUTION_RATIO, ) from .euckrfreq import ( EUCKR_CHAR_TO_FREQ_ORDER, EUCKR_TABLE_SIZE, EUCKR_TYPICAL_DISTRIBUTION_RATIO, ) from .euctwfreq import ( EUCTW_CHAR_TO_FREQ_ORDER, EUCTW_TABLE_SIZE, EUCTW_TYPICAL_DISTRIBUTION_RATIO, ) from .gb2312freq import ( GB2312_CHAR_TO_FREQ_ORDER, GB2312_TABLE_SIZE, GB2312_TYPICAL_DISTRIBUTION_RATIO, ) from .jisfreq import ( JIS_CHAR_TO_FREQ_ORDER, JIS_TABLE_SIZE, JIS_TYPICAL_DISTRIBUTION_RATIO, ) from .johabfreq import JOHAB_TO_EUCKR_ORDER_TABLE class CharDistributionAnalysis: ENOUGH_DATA_THRESHOLD = 1024 SURE_YES = 0.99 SURE_NO = 0.01 MINIMUM_DATA_THRESHOLD = 3 def __init__(self) -> None: # Mapping table to get frequency order from char order (get from # GetOrder()) self._char_to_freq_order: Tuple[int, ...] = tuple() self._table_size = 0 # Size of above table # This is a constant value which varies from language to language, # used in calculating confidence. See # http://www.mozilla.org/projects/intl/UniversalCharsetDetection.html # for further detail. self.typical_distribution_ratio = 0.0 self._done = False self._total_chars = 0 self._freq_chars = 0 self.reset() def reset(self) -> None: """reset analyser, clear any state""" # If this flag is set to True, detection is done and conclusion has # been made self._done = False self._total_chars = 0 # Total characters encountered # The number of characters whose frequency order is less than 512 self._freq_chars = 0 def feed(self, char: Union[bytes, bytearray], char_len: int) -> None: """feed a character with known length""" if char_len == 2: # we only care about 2-bytes character in our distribution analysis order = self.get_order(char) else: order = -1 if order >= 0: self._total_chars += 1 # order is valid if order < self._table_size: if 512 > self._char_to_freq_order[order]: self._freq_chars += 1 def get_confidence(self) -> float: """return confidence based on existing data""" # if we didn't receive any character in our consideration range, # return negative answer if self._total_chars <= 0 or self._freq_chars <= self.MINIMUM_DATA_THRESHOLD: return self.SURE_NO if self._total_chars != self._freq_chars: r = self._freq_chars / ( (self._total_chars - self._freq_chars) * self.typical_distribution_ratio ) if r < self.SURE_YES: return r # normalize confidence (we don't want to be 100% sure) return self.SURE_YES def got_enough_data(self) -> bool: # It is not necessary to receive all data to draw conclusion. # For charset detection, certain amount of data is enough return self._total_chars > self.ENOUGH_DATA_THRESHOLD def get_order(self, _: Union[bytes, bytearray]) -> int: # We do not handle characters based on the original encoding string, # but convert this encoding string to a number, here called order. # This allows multiple encodings of a language to share one frequency # table. return -1 class EUCTWDistributionAnalysis(CharDistributionAnalysis): def __init__(self) -> None: super().__init__() self._char_to_freq_order = EUCTW_CHAR_TO_FREQ_ORDER self._table_size = EUCTW_TABLE_SIZE self.typical_distribution_ratio = EUCTW_TYPICAL_DISTRIBUTION_RATIO def get_order(self, byte_str: Union[bytes, bytearray]) -> int: # for euc-TW encoding, we are interested # first byte range: 0xc4 -- 0xfe # second byte range: 0xa1 -- 0xfe # no validation needed here. State machine has done that first_char = byte_str[0] if first_char >= 0xC4: return 94 * (first_char - 0xC4) + byte_str[1] - 0xA1 return -1 class EUCKRDistributionAnalysis(CharDistributionAnalysis): def __init__(self) -> None: super().__init__() self._char_to_freq_order = EUCKR_CHAR_TO_FREQ_ORDER self._table_size = EUCKR_TABLE_SIZE self.typical_distribution_ratio = EUCKR_TYPICAL_DISTRIBUTION_RATIO def get_order(self, byte_str: Union[bytes, bytearray]) -> int: # for euc-KR encoding, we are interested # first byte range: 0xb0 -- 0xfe # second byte range: 0xa1 -- 0xfe # no validation needed here. State machine has done that first_char = byte_str[0] if first_char >= 0xB0: return 94 * (first_char - 0xB0) + byte_str[1] - 0xA1 return -1 class JOHABDistributionAnalysis(CharDistributionAnalysis): def __init__(self) -> None: super().__init__() self._char_to_freq_order = EUCKR_CHAR_TO_FREQ_ORDER self._table_size = EUCKR_TABLE_SIZE self.typical_distribution_ratio = EUCKR_TYPICAL_DISTRIBUTION_RATIO def get_order(self, byte_str: Union[bytes, bytearray]) -> int: first_char = byte_str[0] if 0x88 <= first_char < 0xD4: code = first_char * 256 + byte_str[1] return JOHAB_TO_EUCKR_ORDER_TABLE.get(code, -1) return -1 class GB2312DistributionAnalysis(CharDistributionAnalysis): def __init__(self) -> None: super().__init__() self._char_to_freq_order = GB2312_CHAR_TO_FREQ_ORDER self._table_size = GB2312_TABLE_SIZE self.typical_distribution_ratio = GB2312_TYPICAL_DISTRIBUTION_RATIO def get_order(self, byte_str: Union[bytes, bytearray]) -> int: # for GB2312 encoding, we are interested # first byte range: 0xb0 -- 0xfe # second byte range: 0xa1 -- 0xfe # no validation needed here. State machine has done that first_char, second_char = byte_str[0], byte_str[1] if (first_char >= 0xB0) and (second_char >= 0xA1): return 94 * (first_char - 0xB0) + second_char - 0xA1 return -1 class Big5DistributionAnalysis(CharDistributionAnalysis): def __init__(self) -> None: super().__init__() self._char_to_freq_order = BIG5_CHAR_TO_FREQ_ORDER self._table_size = BIG5_TABLE_SIZE self.typical_distribution_ratio = BIG5_TYPICAL_DISTRIBUTION_RATIO def get_order(self, byte_str: Union[bytes, bytearray]) -> int: # for big5 encoding, we are interested # first byte range: 0xa4 -- 0xfe # second byte range: 0x40 -- 0x7e , 0xa1 -- 0xfe # no validation needed here. State machine has done that first_char, second_char = byte_str[0], byte_str[1] if first_char >= 0xA4: if second_char >= 0xA1: return 157 * (first_char - 0xA4) + second_char - 0xA1 + 63 return 157 * (first_char - 0xA4) + second_char - 0x40 return -1 class SJISDistributionAnalysis(CharDistributionAnalysis): def __init__(self) -> None: super().__init__() self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER self._table_size = JIS_TABLE_SIZE self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO def get_order(self, byte_str: Union[bytes, bytearray]) -> int: # for sjis encoding, we are interested # first byte range: 0x81 -- 0x9f , 0xe0 -- 0xfe # second byte range: 0x40 -- 0x7e, 0x81 -- oxfe # no validation needed here. State machine has done that first_char, second_char = byte_str[0], byte_str[1] if 0x81 <= first_char <= 0x9F: order = 188 * (first_char - 0x81) elif 0xE0 <= first_char <= 0xEF: order = 188 * (first_char - 0xE0 + 31) else: return -1 order = order + second_char - 0x40 if second_char > 0x7F: order = -1 return order class EUCJPDistributionAnalysis(CharDistributionAnalysis): def __init__(self) -> None: super().__init__() self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER self._table_size = JIS_TABLE_SIZE self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO def get_order(self, byte_str: Union[bytes, bytearray]) -> int: # for euc-JP encoding, we are interested # first byte range: 0xa0 -- 0xfe # second byte range: 0xa1 -- 0xfe # no validation needed here. State machine has done that char = byte_str[0] if char >= 0xA0: return 94 * (char - 0xA1) + byte_str[1] - 0xA1 return -1
Save