Nostr'a Katılın
2026-05-18 03:10:57 CEST

wono on Nostr: /run py def decode_secret_emoji(text: str) -> str: """Decode Secret Emoji to text""" ...

/run py
def decode_secret_emoji(text: str) -> str:
"""Decode Secret Emoji to text"""
VS_START, VS_END = 0xfe00, 0xfe0f # VS1〜VS16の範囲
VS_SUPP_START, VS_SUPP_END = 0xe0100, 0xe01ef # VS17〜VS256の範囲

decoded = []
i = 0

while i < len(text):
cp = ord(text[i])

# PythonがUTF-16内部表現を使う環境ではサロゲートペアが発生する場合がある。
# 上位サロゲート(0xD800〜0xDBFF)を検出したら、
# 次の下位サロゲート(0xDC00〜0xDFFF)と組み合わせて本来のコードポイントを復元する
if 0xD800 <= cp <= 0xDBFF and i + 1 < len(text):
low = ord(text[i + 1])
if 0xDC00 <= low <= 0xDFFF:
cp = 0x10000 + ((cp - 0xD800) << 10) + (low - 0xDC00)
i += 2
else:
i += 1
continue
else:
i += 1

# コードポイントがVSの範囲内であれば、エンコード時の逆算でバイト値を復元する
if VS_START <= cp <= VS_END:
decoded.append(cp - VS_START) # VS1〜VS16 → 0x00〜0x0F
elif VS_SUPP_START <= cp <= VS_SUPP_END:
decoded.append(cp - VS_SUPP_START + 16) # VS17〜VS256 → 0x10〜0xFF
# VS以外の文字(絵文字など)は無視する

# 復元したバイト列をUTF-8としてデコードして文字列に戻す
return bytes(decoded).decode('utf-8', errors='replace')

print(decode_secret_emoji(🥟󠇓󠅱󠅺))