Join Nostr
2026-10-19 11:51:08 UTC

natsuki on Nostr: ...

このコードは、メッセージを**目に見えない文字の列**に変換するためのものです。処理は2段階に分かれています。

**1. `s:utf8_bytes`:文字をUTF-8のバイト列に分解する**

`str2list(a:str, 1)` は、文字列を1文字ずつUnicodeの番号(コードポイント)のリストにします。続くif文は、その番号をUTF-8の規則に従って1〜4バイトに分けています。

- 0x7F以下(ASCII):そのまま1バイト
- 0x7FF以下:2バイト
- 0xFFFF以下(日本語の多く):3バイト
- それ以上(絵文字など):4バイト

1バイト目は先頭の目印(`0xc0`・`0xe0`・`0xf0`)に上位ビットを足した値です。2バイト目以降はどれも `0x80 +(6ビット分)` の形をしています。`/ 0x40` は「6ビット右にずらす」、`% 0x40` は「下位6ビットを取り出す」という意味です。

例として「あ」(U+3042)は `E3 81 82` の3バイトになります。

**2. `s:sexy_dumpling_encode`:各バイトを見えない文字に置き換える**

各バイトに `0xE00F0` を足して、`nr2char()` で文字に戻しています。通常の文字ではバイトが0x10以上になるので、変換先はU+E0100〜U+E01EFの範囲になります。ここは「異体字セレクタ」と呼ばれる領域で、画面には表示されません。`..=` は文字列の末尾に連結する演算子です。

たとえば「A」(0x41)はU+E0131に、「あ」は見えない3文字になります。結果は空に見える文字列ですが、中にはデータが入っています。元に戻すには、各文字から `0xE00F0` を引いてバイト列を復元し、UTF-8として読み直します。

なお、`s:` はこのスクリプト内だけで使える関数、`a:` は関数の引数、`abort` はエラーが起きた時点で関数を止める指定です。