サポンテ 勉強ノート

サポンテの勉強ノート・読書メモなどを晒します。

Chromium アプリケーションと Excel でコピペを繰り返すと余分な空白が付く【Windows / Visual Studio Code / Teams / Excel】

追記

 なんか同じ記事を投稿してしまいました。しかしながら最新の環境では動作しなかったのでついでに訂正し、前の記事を旧バージョン用とします。

はじめに

 Chromium アプリケーション(例:Google ChromeVisual Studio Code、Edge、Microsoft Teams など)と Excel でコピペを繰り返すと余分な空白が付く場合があります。これは Non‐breaking space というもので、ブラウザの表示の都合上で使われます。文字コードでは(U+00A0)です。

 コンピューターにそのまま渡す文字列(たとえばコードスニペット)を上記アプリケーションでやり取りしたりすると問題が発生することがあります。Visual Studio Code から Excel にコピペしたり、Teams でスニペットを共有するとよく発生します。

発生する問題

 コンパイルエラーになったり、実行時エラーになったりします。

 とくによく起こるのは、Object Browser や A5M2 で SQL が実行エラーになる問題です。それらの内部エディタでは不正な空白文字を、とくに強調はしてくれないので、原因を見つけるのが困難です。

発見する方法

 メインのテキストエディタVisual Studio Code の場合、VSCode にコピペすると強調してくれるのでよく判ります。

Replace U+00a0 (nbsp) (or other unicode) characters with VS Code | Karsten's Blog

除去する方法

 VSCode なら、置き換え機能で [\xa0] を半角空白に置き換えると解決します。その他のテキストエディタでも、同様の方法はあります。

 サポンテは「クリップボードに格納された文字列に含まれる(U+00A0)を除去する PowerShell スクリプト」を作り、Launchy で起動しています。

スクリプト

 上記の PowerShell(バージョン 7.4 以降)のスクリプトを以下に置いておきます。

Set-StrictMode -Version Latest

# クリップボードからテキストを取得する
$clipboardContent = (Get-Clipboard -Format Text)

# 空白を置き換える
$replacedContent = ($clipboardContent -Replace "[\p{Zs}]", " ")

# 垂直タブを置き換える
$replacedContent = ($replacedContent -Replace "[\v]", " ")

# 変更したテキストをクリップボードに書き戻す
Set-Clipboard $replacedContent

 上記の PowerShell スクリプトを呼び出すバッチファイルの内容は以下です。

powershell -ExecutionPolicy Bypass .\nbsp_remover.ps1