制御文字は色々ありますが、通常の文中に出てくる制御文字は復帰(\r)、改行(\n)、タブ(\t)など限られたものだけだと思います。それ以外の制御文字は文中に入ると文字化けしたりします。

cc

次の記事では文中に制御文字が入った場合の問題を紹介しています。

最近、Slackアプリでバックスペースがおかしな文字が入っていたのも同じような原因です。

これらを見つけるtextlintルールとして@textlint-rule/textlint-rule-no-invalid-control-characterを作りました。

すべての制御文字を禁止すると改行すら出来なくなってしまうので次の制御文字は許可されています。 また、チェックするのはただの文字列中に制御文字が混じってる場合のみで、CodeBlockの中などはチェックしないので問題ありません。

許可されている制御文字

  • \r
  • \n
  • \t

許可されていない制御文字

その他のControl characterであるもの

  • \u0010 DATA LINK ESCAPE
  • \u0019 ND OF MEDIUM
  • etc…

インストール

@textlint-rule/textlint-rule-no-invalid-control-characterはnpmでインストールできます。

npm install @textlint-rule/textlint-rule-no-invalid-control-character

使い方

.textlintrcに設定するだけです。

{
    "rules": {
        "@textlint-rule/no-invalid-control-character": true
    }
}

オプション

  • allow: string[]
    • 例外として許可したい制御文字を指定
{
    "rules": {
        "@textlint-rule/no-invalid-control-character": {
            "allow": [
                "\v"
            ]
        }
    }
}

おわりに

\u0019などの制御文字が文中に入るのはIMのバグとか何らかの問題がある場合が殆どだと思うので、デフォルトで弾くのが良い気がします。

@textlint-rule/textlint-rule-no-invalid-control-characterに似たルールとして、Macでコピペすると濁点が分離する問題を見つけるtextlint-rule-no-nfdなどがあります。