Psyduck - 可達鴨 之 鴨力山大2


Server : LiteSpeed
System : Linux premium217.web-hosting.com 4.18.0-553.54.1.lve.el8.x86_64 #1 SMP Wed Jun 4 13:01:13 UTC 2025 x86_64
User : alloknri ( 880)
PHP Version : 8.1.34
Disable Function : NONE
Directory :  /opt/alt/python310/lib64/python3.10/encodings/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : //opt/alt/python310/lib64/python3.10/encodings/punycode.py
""" Codec for the Punicode encoding, as specified in RFC 3492

Written by Martin v. Löwis.
"""

import codecs

##################### Encoding #####################################

def segregate(str):
    """3.1 Basic code point segregation"""
    base = bytearray()
    extended = set()
    for c in str:
        if ord(c) < 128:
            base.append(ord(c))
        else:
            extended.add(c)
    extended = sorted(extended)
    return bytes(base), extended

def selective_len(str, max):
    """Return the length of str, considering only characters below max."""
    res = 0
    for c in str:
        if ord(c) < max:
            res += 1
    return res

def selective_find(str, char, index, pos):
    """Return a pair (index, pos), indicating the next occurrence of
    char in str. index is the position of the character considering
    only ordinals up to and including char, and pos is the position in
    the full string. index/pos is the starting position in the full
    string."""

    l = len(str)
    while 1:
        pos += 1
        if pos == l:
            return (-1, -1)
        c = str[pos]
        if c == char:
            return index+1, pos
        elif c < char:
            index += 1

def insertion_unsort(str, extended):
    """3.2 Insertion unsort coding"""
    oldchar = 0x80
    result = []
    oldindex = -1
    for c in extended:
        index = pos = -1
        char = ord(c)
        curlen = selective_len(str, char)
        delta = (curlen+1) * (char - oldchar)
        while 1:
            index,pos = selective_find(str,c,index,pos)
            if index == -1:
                break
            delta += index - oldindex
            result.append(delta-1)
            oldindex = index
            delta = 0
        oldchar = char

    return result

def T(j, bias):
    # Punycode parameters: tmin = 1, tmax = 26, base = 36
    res = 36 * (j + 1) - bias
    if res < 1: return 1
    if res > 26: return 26
    return res

digits = b"abcdefghijklmnopqrstuvwxyz0123456789"
def generate_generalized_integer(N, bias):
    """3.3 Generalized variable-length integers"""
    result = bytearray()
    j = 0
    while 1:
        t = T(j, bias)
        if N < t:
            result.append(digits[N])
            return bytes(result)
        result.append(digits[t + ((N - t) % (36 - t))])
        N = (N - t) // (36 - t)
        j += 1

def adapt(delta, first, numchars):
    if first:
        delta //= 700
    else:
        delta //= 2
    delta += delta // numchars
    # ((base - tmin) * tmax) // 2 == 455
    divisions = 0
    while delta > 455:
        delta = delta // 35 # base - tmin
        divisions += 36
    bias = divisions + (36 * delta // (delta + 38))
    return bias


def generate_integers(baselen, deltas):
    """3.4 Bias adaptation"""
    # Punycode parameters: initial bias = 72, damp = 700, skew = 38
    result = bytearray()
    bias = 72
    for points, delta in enumerate(deltas):
        s = generate_generalized_integer(delta, bias)
        result.extend(s)
        bias = adapt(delta, points==0, baselen+points+1)
    return bytes(result)

def punycode_encode(text):
    base, extended = segregate(text)
    deltas = insertion_unsort(text, extended)
    extended = generate_integers(len(base), deltas)
    if base:
        return base + b"-" + extended
    return extended

##################### Decoding #####################################

def decode_generalized_number(extended, extpos, bias, errors):
    """3.3 Generalized variable-length integers"""
    result = 0
    w = 1
    j = 0
    while 1:
        try:
            char = ord(extended[extpos])
        except IndexError:
            if errors == "strict":
                raise UnicodeError("incomplete punicode string")
            return extpos + 1, None
        extpos += 1
        if 0x41 <= char <= 0x5A: # A-Z
            digit = char - 0x41
        elif 0x30 <= char <= 0x39:
            digit = char - 22 # 0x30-26
        elif errors == "strict":
            raise UnicodeError("Invalid extended code point '%s'"
                               % extended[extpos-1])
        else:
            return extpos, None
        t = T(j, bias)
        result += digit * w
        if digit < t:
            return extpos, result
        w = w * (36 - t)
        j += 1


def insertion_sort(base, extended, errors):
    """3.2 Insertion unsort coding"""
    char = 0x80
    pos = -1
    bias = 72
    extpos = 0
    while extpos < len(extended):
        newpos, delta = decode_generalized_number(extended, extpos,
                                                  bias, errors)
        if delta is None:
            # There was an error in decoding. We can't continue because
            # synchronization is lost.
            return base
        pos += delta+1
        char += pos // (len(base) + 1)
        if char > 0x10FFFF:
            if errors == "strict":
                raise UnicodeError("Invalid character U+%x" % char)
            char = ord('?')
        pos = pos % (len(base) + 1)
        base = base[:pos] + chr(char) + base[pos:]
        bias = adapt(delta, (extpos == 0), len(base))
        extpos = newpos
    return base

def punycode_decode(text, errors):
    if isinstance(text, str):
        text = text.encode("ascii")
    if isinstance(text, memoryview):
        text = bytes(text)
    pos = text.rfind(b"-")
    if pos == -1:
        base = ""
        extended = str(text, "ascii").upper()
    else:
        base = str(text[:pos], "ascii", errors)
        extended = str(text[pos+1:], "ascii").upper()
    return insertion_sort(base, extended, errors)

### Codec APIs

class Codec(codecs.Codec):

    def encode(self, input, errors='strict'):
        res = punycode_encode(input)
        return res, len(input)

    def decode(self, input, errors='strict'):
        if errors not in ('strict', 'replace', 'ignore'):
            raise UnicodeError("Unsupported error handling "+errors)
        res = punycode_decode(input, errors)
        return res, len(input)

class IncrementalEncoder(codecs.IncrementalEncoder):
    def encode(self, input, final=False):
        return punycode_encode(input)

class IncrementalDecoder(codecs.IncrementalDecoder):
    def decode(self, input, final=False):
        if self.errors not in ('strict', 'replace', 'ignore'):
            raise UnicodeError("Unsupported error handling "+self.errors)
        return punycode_decode(input, self.errors)

class StreamWriter(Codec,codecs.StreamWriter):
    pass

class StreamReader(Codec,codecs.StreamReader):
    pass

### encodings module API

def getregentry():
    return codecs.CodecInfo(
        name='punycode',
        encode=Codec().encode,
        decode=Codec().decode,
        incrementalencoder=IncrementalEncoder,
        incrementaldecoder=IncrementalDecoder,
        streamwriter=StreamWriter,
        streamreader=StreamReader,
    )
Name
Size
Permissions
Options
__pycache__
--
drwxr-xr-x
__init__.py
5.488 KB
-rw-r--r--
aliases.py
15.31 KB
-rw-r--r--
ascii.py
1.219 KB
-rw-r--r--
base64_codec.py
1.497 KB
-rw-r--r--
big5.py
0.995 KB
-rw-r--r--
big5hkscs.py
1.015 KB
-rw-r--r--
bz2_codec.py
2.196 KB
-rw-r--r--
charmap.py
2.035 KB
-rw-r--r--
cp037.py
12.813 KB
-rw-r--r--
cp1006.py
13.25 KB
-rw-r--r--
cp1026.py
12.806 KB
-rw-r--r--
cp1125.py
33.786 KB
-rw-r--r--
cp1140.py
12.798 KB
-rw-r--r--
cp1250.py
13.365 KB
-rw-r--r--
cp1251.py
13.048 KB
-rw-r--r--
cp1252.py
13.194 KB
-rw-r--r--
cp1253.py
12.787 KB
-rw-r--r--
cp1254.py
13.186 KB
-rw-r--r--
cp1255.py
12.174 KB
-rw-r--r--
cp1256.py
12.514 KB
-rw-r--r--
cp1257.py
13.061 KB
-rw-r--r--
cp1258.py
13.051 KB
-rw-r--r--
cp273.py
13.801 KB
-rw-r--r--
cp424.py
11.772 KB
-rw-r--r--
cp437.py
33.754 KB
-rw-r--r--
cp500.py
12.813 KB
-rw-r--r--
cp720.py
13.365 KB
-rw-r--r--
cp737.py
33.868 KB
-rw-r--r--
cp775.py
33.668 KB
-rw-r--r--
cp850.py
33.306 KB
-rw-r--r--
cp852.py
34.182 KB
-rw-r--r--
cp855.py
33.057 KB
-rw-r--r--
cp856.py
12.132 KB
-rw-r--r--
cp857.py
33.113 KB
-rw-r--r--
cp858.py
33.218 KB
-rw-r--r--
cp860.py
33.868 KB
-rw-r--r--
cp861.py
33.821 KB
-rw-r--r--
cp862.py
32.588 KB
-rw-r--r--
cp863.py
33.449 KB
-rw-r--r--
cp864.py
32.874 KB
-rw-r--r--
cp865.py
33.807 KB
-rw-r--r--
cp866.py
33.59 KB
-rw-r--r--
cp869.py
32.192 KB
-rw-r--r--
cp874.py
12.3 KB
-rw-r--r--
cp875.py
12.553 KB
-rw-r--r--
cp932.py
0.999 KB
-rw-r--r--
cp949.py
0.999 KB
-rw-r--r--
cp950.py
0.999 KB
-rw-r--r--
euc_jis_2004.py
1.026 KB
-rw-r--r--
euc_jisx0213.py
1.026 KB
-rw-r--r--
euc_jp.py
1.003 KB
-rw-r--r--
euc_kr.py
1.003 KB
-rw-r--r--
gb18030.py
1.007 KB
-rw-r--r--
gb2312.py
1.003 KB
-rw-r--r--
gbk.py
0.991 KB
-rw-r--r--
hex_codec.py
1.473 KB
-rw-r--r--
hp_roman8.py
13.159 KB
-rw-r--r--
hz.py
0.987 KB
-rw-r--r--
idna.py
8.885 KB
-rw-r--r--
iso2022_jp.py
1.028 KB
-rw-r--r--
iso2022_jp_1.py
1.036 KB
-rw-r--r--
iso2022_jp_2.py
1.036 KB
-rw-r--r--
iso2022_jp_2004.py
1.048 KB
-rw-r--r--
iso2022_jp_3.py
1.036 KB
-rw-r--r--
iso2022_jp_ext.py
1.044 KB
-rw-r--r--
iso2022_kr.py
1.028 KB
-rw-r--r--
iso8859_1.py
12.867 KB
-rw-r--r--
iso8859_10.py
13.271 KB
-rw-r--r--
iso8859_11.py
12.046 KB
-rw-r--r--
iso8859_13.py
12.96 KB
-rw-r--r--
iso8859_14.py
13.332 KB
-rw-r--r--
iso8859_15.py
12.902 KB
-rw-r--r--
iso8859_16.py
13.239 KB
-rw-r--r--
iso8859_2.py
13.09 KB
-rw-r--r--
iso8859_3.py
12.782 KB
-rw-r--r--
iso8859_4.py
13.063 KB
-rw-r--r--
iso8859_5.py
12.71 KB
-rw-r--r--
iso8859_6.py
10.579 KB
-rw-r--r--
iso8859_7.py
12.543 KB
-rw-r--r--
iso8859_8.py
10.777 KB
-rw-r--r--
iso8859_9.py
12.848 KB
-rw-r--r--
johab.py
0.999 KB
-rw-r--r--
koi8_r.py
13.456 KB
-rw-r--r--
koi8_t.py
12.884 KB
-rw-r--r--
koi8_u.py
13.439 KB
-rw-r--r--
kz1048.py
13.401 KB
-rw-r--r--
latin_1.py
1.234 KB
-rw-r--r--
mac_arabic.py
35.612 KB
-rw-r--r--
mac_croatian.py
13.313 KB
-rw-r--r--
mac_cyrillic.py
13.139 KB
-rw-r--r--
mac_farsi.py
14.814 KB
-rw-r--r--
mac_greek.py
13.399 KB
-rw-r--r--
mac_iceland.py
13.182 KB
-rw-r--r--
mac_latin2.py
13.787 KB
-rw-r--r--
mac_roman.py
13.164 KB
-rw-r--r--
mac_romanian.py
13.341 KB
-rw-r--r--
mac_turkish.py
13.196 KB
-rw-r--r--
mbcs.py
1.183 KB
-rw-r--r--
oem.py
0.995 KB
-rw-r--r--
palmos.py
13.202 KB
-rw-r--r--
ptcp154.py
13.687 KB
-rw-r--r--
punycode.py
6.722 KB
-rw-r--r--
quopri_codec.py
1.489 KB
-rw-r--r--
raw_unicode_escape.py
1.301 KB
-rw-r--r--
rot_13.py
2.405 KB
-rwxr-xr-x
shift_jis.py
1.015 KB
-rw-r--r--
shift_jis_2004.py
1.034 KB
-rw-r--r--
shift_jisx0213.py
1.034 KB
-rw-r--r--
tis_620.py
12.012 KB
-rw-r--r--
undefined.py
1.269 KB
-rw-r--r--
unicode_escape.py
1.273 KB
-rw-r--r--
utf_16.py
5.113 KB
-rw-r--r--
utf_16_be.py
1.013 KB
-rw-r--r--
utf_16_le.py
1.013 KB
-rw-r--r--
utf_32.py
5.009 KB
-rw-r--r--
utf_32_be.py
0.908 KB
-rw-r--r--
utf_32_le.py
0.908 KB
-rw-r--r--
utf_7.py
0.924 KB
-rw-r--r--
utf_8.py
0.981 KB
-rw-r--r--
utf_8_sig.py
4.036 KB
-rw-r--r--
uu_codec.py
2.784 KB
-rw-r--r--
zlib_codec.py
2.152 KB
-rw-r--r--