仕事中に原因不明の文字化けに遭遇。
エクセルのファイルをCSV形式に変換すると、半角スペースがあったところが「?」マークになってしまう。
このエクセルファイルは日付とタイトルを一覧にしたものだが、日付は手入力、タイトルは別のところからのコピペで作成している。問題が起きているのはそのタイトル部に含まれた半角スペースだ。
まずは文字コードを調べてみる
古い人間なので、テキスト処理でおかしなことが起きたら、まずは文字コードを調べてみる。大抵それで何が起きているのかわかりますし。
しかし自宅ならバイナリエディタでCSVファイルを開くところですが、会社PCには自由にソフトをインストール出来ないので、バイナリエディタを使うことが出来ない。
仕方がないのでエクセルの関数を使うことに。
code関数とmid関数を使って、セルに
と記述。
これで先頭からの場所を変えていき、文字化けしてる部分のコードを見に行く。
すると、文字コード160と出ました。16進表現にすると、0xA0ですね。
確か半角スペースは32(0x20)だったはずなので、明らかに半角スペースとは違います。
エクセル上では半角スペースに見えて、CSVにすると「?」になるという謎な文字です。
今度はこのコードをグーグルで検索してみました。
ノンブレークスペース(nbsp)って何?
どうやらこれ、ノンブレークスペースというらしいです。通常のスペースは、行末に掛かるとそこで改行されてしまうのですが、このnbspを使えば改行されないというもの。nbspも含めて1つの単語と見なす、という意味のようです。
ところでこれ。どこかで見たことあります。
「 」と書けば、htmlで見かける、あれですね。スペースのつもりで使われていますが、厳密には違ったんですね。
しかし今はそんなことはどうでもいいです。文字化けの対策をしなくては。
エクセルで置換する
一番簡単なのはエクセルで置換処理をかけることです。
既に文字コードは判明しましたので、0xA0を0x20に置換してしまえばそれで終了です。
めでたし、めでたし。
と、したいのですが、そうはいかないのです。
自分でやるならそれでもいいのですが、この作業は他の方にお願いしており、毎回置換処理をかけてもらう訳にはいきません。しかも、なぜか毎回起きている訳ではないようなのです。今度はこの再現性の調査になります。
勝負はコピペのペで決まっていた!
改めて現象を整理すると次のようになります。
- 文字コードの相違はエクセル上で既に起こっており、CSV形式にするときにそれが表面化する
- タイトル部はブラウザからコピーして、それをエクセルへペーストしている
- 同じものをコピーしても、文字コードは0xA0のときと0x20のときがある
どうもわからない。ソースは同じ。出力も同じ。問題がおきそうなのはコピペ操作くらいしか浮かばない。
問題はnbspということは間違いないので、手元でnbspを含んだ文字列をいくつか表示し、それをブラウザからコピーしてみることに。
まずは1行をコピペ。コード確認。0x20だ。エクセルに貼る時点で自動的に変換されている。
では、自動的に変換されないケースがあるということか?
もう一度検証するため、今度は3行まとめてコピペ。コード確認。0xA0だ!再現した!
でもでも、何が違う?まとめてコピーしたから?
頭の中で、操作に違いがなかったか思い出してみる。
!!
思い当たる点が1つ浮かんだ。
1行をコピー。エクセルでセルを選択してペースト。コード確認。0xA0!
次、もう一度コピー。エクセルで、セルをダブルクリックしてカーソルが出ている状態でペースト。コード確認。0x20!
これだ!
エクセルにペーストするとき、セルを選択した状態でペーストすると、いろいろな属性と共にペーストされる。
セルをダブルクリックしてカーソルが出ている状態だと、値だけをペースト出来る。このときに自動的に変換されていた!
つまり、今までの作業で文字化けしたりしなかったりだったのは、作業者が無意識のうちにセルの状態を変えていたため、結果が異なっていたのだ。こんなこと今まで気にしたこともなかった。
まとめ
今回、ホームページからエクセルにコピペしたときに、謎の文字化けに遭遇したときの対処法を調査した。
ホームページからコピペするときに半角スペースがあると、実は のことがあり、それがエクセル上でコードの違いで半角スペースとは違った動作をすることがある。ネットを検索すると、他にも悩んでいる人がいたようだ。
文字置換で解決する策が見つかったが、今回は違うアプローチとして、エクセルに貼り付けるときの操作を変えることで対処する方法を紹介してみた。
実際にこの方法を担当者へ操作法を伝えたので、今後は文字化けが発生しないことを期待したい。
コメント