UTF-8の半角スペースには2種類ある


SyntaxHighlighterで表示させているコードをChromeからPyCharmへコピペすると行頭のスペースが認識されません。FirefoxやIEからでは問題は起きません。どうもこれはUTF-8の半角スペース「C2A0」が原因のようです。これをノーブレークスペース( )というようです。
(2016.5.17追記。SyntaxHighlighter3.0.9ではノーブレークスペースをブレーキングスペースに変換して出力しているのでChromeからコピペしても問題は起きません。linuxBean14.04(111)SyntaxHighlighter3.0.9をビルドする:成功編参照。)

PyCharmが認識しないUTF-8の半角スペースがある

def gcd(x, y):
    if y == 0:
        return x
    else:
        return gcd(y, x % y)
print(gcd(24, 9))
このSyntaxHighlighterで表示させているコードをダブルクリックするとコードだけが選択できます。


これをChromeからPyCharm3.4にペーストします。


行頭にスペースはちゃんと4個になっていますが赤色になってエラーになっています。

このようになるのはWindowsではChromeとSleipnir4からコピペしたときだけです。

(LinuxではChromeとOperaでなりました。)

FirefoxやIEからでは問題は起こりません。

このエラーがでたままでは実行できません。

赤色のところにカーソルをもってくるとエラーの内容が表示されます。

Statement expected, found BAD_CHARACTER

直接解答が書いてあるページは見つけられなかったのですが、どうもこれは行頭の半角スペースのエンコードがおかしい、ということのようです。

ためしに同じ内容をWindows7のメモ帳にペーストします。


見た目は問題ありません。

このファイルを保存してみます。


全角文字が含まれていないので文字コードは「ANSI」でいけると思ったらエラーがでてきます。


「ANSI」では保存できない「Unicode形式」の文字を含んでいるそうです。どこに?

そのまま「OK」をクリックしてファイルを保存したあとそのファイルをメモ帳で開き直してみます。


行頭の半角スペースがすべて「?」に置換されてしまっていますね。

PyCharmで赤色に表示された部分と一致しています。

行頭以外の半角スペースは問題ないのでダメな半角スペースとダメではない半角スペースがあるようです。

UTF-8の半角スペースについて - とりあえず落ち着け

ここを読んで納得できました。

これはUTF-8では2種類の半角スペースが使われており、そのうち文字コード「C2A0」で表される空白がPyCharmでは認識できないようです。

PyCharmでUTF-8の半角スペースをANSIの半角スペースに置換する

(2014.7.14追記。PyCharmで置換コマンドがないと思っていましたがちゃんとありましたので訂正して書き直しました。)

PyCharmでUTF-8に設定していてもダメです。

PyCharmでこのUTF-8の半角スペースにはまず赤色で表示されているUTF-8の半角スペースの一文字分を選択します。


この状態でメニューからEdit→Find→Replace。

すると置換ツールが表示されます。


ここで上の欄には置換対象の文字列、下の欄には置換後の文字列を入力します。

UTF-8の半角スペースを選択した状態でメニューからEdit→Find→Replace、で自動的に置換対象の欄にUTF-8の半角スペースが入力されているので、上の欄はいじってはいけません。

下の置換後の文字列をクリックした後、半角スペースを入力します。


半角スペースを入力しても表示されませんので不安になりますが、よくみると入力欄の右端にxボタンが表示されます。
入力欄が本当に空っぽですとこのxボタンは表示されません。

試しに上の欄にクリックしてみると右端にxボタンが出現されるはずです。

その欄にUTF-8の半角スペースがちゃんと入っているということです。

上下の欄にそれぞれUTF-8の半角スペース、キーボードからの半角スペース、を入力したらあとは右にある「Replace all」ボタンをクリックします。

これで赤い背景色は一掃されるはずです。

PyCharmで一発置換するマクロを作ろうとしましたがうまくつくれませんでした。

LibreOffice WriterではUTF-8の半角スペースは灰色に表示される



LibreOffice 4.2.2.1のWriterにペーストするとこのように灰色に表示されます。

印刷プレビューではこの灰色は表示されないので実用上は問題なさそうですけど、理由を知らないと気持ち悪いですよね。

GeanyならReplace Spaces by Tabsで4つのスペースをタブに一発置換が可能

(2015.6.5追記。Geanyを使えば簡単に行頭のスペースをタブに置換できることを発見しました。)

ソースコードエディタのGeanyには、文書→Repalace Spaces by Tabs、という項目があり、これを使うと指定した数の連続空白スペースをタブに置換できます。

この機能を使うとPythonスクリプトの行頭の「C2A0」スペースを一発でタブに置換してくれるので便利です。

linuxBean14.04(7)GeanyでLibreOfficeのPythonマクロ編集で導入したGeanyではうまくいきました。

Windows版のGeanyにも同じメニュー項目があり同じことができると思います。

うまくいったと思ったのですが他のマシンで一からやってみるとRepalace Spaces by Tabsを実行しても「C2A0」スペースに反応しませんでした。

GeanyでUTF-8のノーブレークスペース( )を一発置換する

(2015.6.7追記。以下はlinuxBeanの場合です。linuxBean14.04(26)Geanyのビルドコマンドの設定参照。)


 置換 sed -i -e 's/\xC2\xA0/ /g' %f

Geanyの「ビルドコマンドを設定」の「コマンドの実行」でこの「 置換」を設定すると開いているファイルのノーブレークスペース( )が普通のスペースに置換されます。


ChromeからソースコードをGeanyにコピペすると行頭の半角スペースは なので動作しません。

ビルド→ 置換、を実行します。


「再読み込みしますか?」、といわれるので「再読み込み」します。


ノーブレークスペース( )が半角スペースに置換されてPythonスクリプトと認識されて折り畳みなどできるようになりました。

参考にしたサイト


UTF-8も半角スペースにはANSIと同じ半角スペース以外に文字コード「C2A0」が使われます。

Geany : Home Page
ソースコードエディタ。

sed コマンド | コマンドの使い方(Linux) | hydroculのメモ
文字列置換などを行うコマンド。

linux - use sed to replace nbsp, 160, Hex 00a0, Octal 240, non-breaking space - Super User
sedでノーブレークスペースを普通の半角スペースに置換する例が載っています。
PR

0 件のコメント:

コメントを投稿