Javascriptで制御文字除去 » 履歴 » バージョン 2
sylow castle, 2026/07/11 13:36
| 1 | 1 | sylow castle | # Javascriptで制御文字除去 |
|---|---|---|---|
| 2 | |||
| 3 | Geminiが提案した以下のコードの解説の記録: |
||
| 4 | ちなみに言語はJavaScript |
||
| 5 | |||
| 6 | 2 | sylow castle | ```javascript |
| 7 | 1 | sylow castle | function escapeControlChars(str) { |
| 8 | // 0x00-0x1F (LF:0x0A, TAB:0x09 を除く) および 0x7F を対象にする |
||
| 9 | // \x00-\x08: NUL~BS |
||
| 10 | // \x0B-\x0C: VT, FF |
||
| 11 | // \x0E-\x1F: SO~US |
||
| 12 | // \x7F: DEL |
||
| 13 | return str.replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g, (match) => { |
||
| 14 | const code = match.charCodeAt(0).toString(16).toUpperCase().padStart(2, '0'); |
||
| 15 | return `\\x${code}`; |
||
| 16 | }); |
||
| 17 | } |
||
| 18 | |||
| 19 | // テスト |
||
| 20 | console.log(escapeControlChars("Hello\x00World\x07!")); |
||
| 21 | // "Hello\x00World\x07!" |
||
| 22 | ``` |
||
| 23 | --- |
||
| 24 | |||
| 25 | 質問: |
||
| 26 | ごめん、このコードを採用したいけどよく分からないところがあるから説明聞いて良い?具体的にはアロー関数の中身のconst code =の右辺の所 |
||
| 27 | |||
| 28 | もちろん大歓迎です!あの1行は、少しだけ詰め込んで書いているので、分解して考えると非常にシンプルですよ。 |
||
| 29 | |||
| 30 | ``` |
||
| 31 | const code = match.charCodeAt(0).toString(16).toUpperCase().padStart(2, '0'); |
||
| 32 | |||
| 33 | ``` |
||
| 34 | |||
| 35 | この右辺を「左から右へ」順番に処理を追いかけてみましょう。 |
||
| 36 | |||
| 37 | ### 1. `match.charCodeAt(0)` |
||
| 38 | |||
| 39 | * **やっていること:** 見つかった制御文字(例えば `\x07`)を、その文字コード(数値)に変換しています。 |
||
| 40 | * **結果:** `7` という数値になります(`\x07` は文字コード 7 なので)。 |
||
| 41 | |||
| 42 | ### 2. `.toString(16)` |
||
| 43 | |||
| 44 | * **やっていること:** さっきの数値 `7` を「16進数」の文字列に変換します。 |
||
| 45 | * **結果:** `"7"` という文字列になります。 |
||
| 46 | * もし文字コードが `25` (0x19) なら、`"19"` になります。 |
||
| 47 | |||
| 48 | ### 3. `.toUpperCase()` |
||
| 49 | |||
| 50 | * **やっていること:** 英語のアルゴリズム(a-f)を大文字にします。 |
||
| 51 | * **結果:** もし `1a` になっていたら `1A` になります。見た目を整えるための処理です。 |
||
| 52 | |||
| 53 | ### 4. `.padStart(2, '0')` |
||
| 54 | |||
| 55 | * **やっていること:** 「文字数が2桁になるまで、足りない分を左側に `0` で埋める」というメソッドです。 |
||
| 56 | * **結果:** |
||
| 57 | * `"7"` が `"07"` になります。 |
||
| 58 | * `"1A"` は2桁あるので、そのまま `"1A"` になります。 |
||
| 59 | * これで、`\x07` や `\x0A` のように、常に2桁で統一された綺麗な形になります。 |
||
| 60 | |||
| 61 | |||
| 62 | |||
| 63 | --- |
||
| 64 | |||
| 65 | ### なぜこう書いているのか? |
||
| 66 | |||
| 67 | 最後に `return `\x${code}`;` とすることで、例えば `\x07` という文字が **`\x07` という「文字の羅列」** に変換されて出力されます。 |
||
| 68 | |||
| 69 | * **元の状態:** 画面に表示しても何も出ない、あるいはシステムを破壊しかねない「制御文字そのもの」 |
||
| 70 | * **変換後:** `\` `x` `0` `7` という4つの文字データ。これなら、テキストファイルに保存しても、画面に表示しても、安全で確実に元のコードが何だったのかを人間が読み取れます。 |
||
| 71 | |||
| 72 | ### まとめると |
||
| 73 | |||
| 74 | この1行は、「見つけた制御文字を、安全にログとして表示できる『\xXX』形式の文字列に変身させている」という処理です。 |
||
| 75 | |||
| 76 | もし「ここのメソッド、あんまり馴染みがないな」というものがあれば、さらに詳しく解説しますので遠慮なく聞いてくださいね! |