Indesignで文字コードを表示するスクリプト

DTPのアレコレ

タイトルそのままのスクリプトをChatGPTに作成してもらいました。
役に立つかは、あなた次第!

字形パレットや字形検索は使いにくい

Narrow No-Break Space を「字形の検索」で表示すると、「U+0020」(通常の半角スペース)になります。
本来は「U+202F」ですが、このような特殊なスペースなど文字コードの一部は「字形の検索」ではわかりませんし、字形パレットも使い勝手が悪いです。

 

 

↓スクリプトを実行した結果

選択した文字すべての文字コードを表示します。下記は表の1文字だけの列を選択しているので、結果はこのようになります。

混乱しがちな文字列のUnicodeを表示させると、こんな感じ。

どこかで誰かの役に立つかもしれない、スクリプトでした。

スクリプトコード

/*==========================================================
Indesign上で文字コードを確認するスクリプト
(テキスト範囲の全ての文字が対象)
===========================================================*/

(function () {
    if (app.documents.length === 0) {
        alert("ドキュメントを開いてください。");
        return;
    }

    var sel = app.selection[0];
    if (!sel || !(sel.hasOwnProperty("characters") || sel.constructor.name === "InsertionPoint")) {
        alert("テキストを選択してください。");
        return;
    }

    var chars;
    if (sel.hasOwnProperty("characters") && sel.characters.length > 0) {
        chars = sel.characters;
    } else if (sel.constructor.name === "InsertionPoint" && sel.parentStory.characters.length > 0) {
        chars = sel.parentStory.characters;
    } else {
        alert("有効なテキストを選択してください。");
        return;
    }

    var unicodeNames = {
        0x2002: "EN SPACE",
        0x2003: "EM SPACE",
        0x2005: "1/4 SPACE",
        0x2009: "THIN SPACE",
        0x200A: "HAIR SPACE",
        0x200B: "ZERO WIDTH SPACE",
        0x200D: "ZERO WIDTH JOINER",
        0x202F: "NARROW NO-BREAK SPACE",
        0x2060: "WORD JOINER",
        0x2010: "HYPHEN",
        0x2011: "NON-BREAKING HYPHEN",
        0x2012: "FIGURE DASH",
        0x2013: "EN DASH",
        0x2014: "EM DASH",
        0x2015: "HORIZONTAL BAR",
        0x00A0: "NO-BREAK SPACE",
        0x3000: "IDEOGRAPHIC SPACE"
    };

    var result = "";
    for (var i = 0; i < chars.length; i++) {
        var c = chars[i];
        var ch, code;

        try {
            ch = c.texts[0].contents;
            if (!ch || ch.length === 0) {
                result += "(空の文字)\r";
                continue;
            }
            code = ch.charCodeAt(0);
        } catch (e) {
            result += "(取得エラー)\r";
            continue;
        }

        if (isNaN(code)) {
            result += "(不明な文字)\r";
            continue;
        }

        var shown;
        if (ch === " ") {
            shown = "(スペース)";
        } else if (code < 32) {
            shown = "(制御文字)";
        } else {
            shown = "\"" + ch + "\"";
        }

        var hex = code.toString(16).toUpperCase();
        while (hex.length < 4) hex = "0" + hex;
        var uniStr = "U+" + hex;

        var name = unicodeNames[code] ? " (" + unicodeNames[code] + ")" : "";

        result += shown + " → " + uniStr + name + "\r";
    }

    var w = new Window("dialog", "Unicode確認");
    w.orientation = "column";
    w.alignChildren = ["fill", "top"];

    var text = w.add("edittext", undefined, result, {
        multiline: true,
        readonly: true,
        scrolling: true
    });
    text.preferredSize = [500, 300];

    w.add("button", undefined, "閉じる", { name: "ok" });
    w.show();
})();

スペースは表示ができないのと、ダッシュ類は区別がつきにくいので、コードネームが付くようになっています。
ほかの文字にもコードネームを付けたいところではありますが、ChatGPTと紆余曲折した結果です。
コード見てわかる方は適当にアレンジしてくださいね。