🥷

nbsp (ノーブレークスペース) って、なに?

2024/11/16に公開

ノーブレークスペース

&nbspという呪文を見たことがありますか?HTMLを書いたことがある方はご存じかもしれません。
あれはノーブレークスペースと呼ばれるものです。
ノーブレークスペース - Wikipedia

複数の単語をひとつの塊として表現したい ("100 km", "Mr. Hoge"など) 場合に、改行を禁止する目的で使われる特殊なスペースです。
日本語圏では語間にスペースを入れることが無いので、あまり馴染みがないかもしれません。

半角スペースにしか見えないという罠

先日、HTMLファイルを取り込んで文字を色々するみたいなことをやっていた時のこと。
以下はJavaで動作確認をしています。

String str1 = Properties.getProperty("hoge")); // この中身は文字列 "hoge hoge"
String str2 = body.getElementsByTag("hoge").text(); // この中身はHTMLファイルから取り込んだ"hoge hoge"

System.out.println(str1.equals(str2)); 
// false

なんとfalseが出力されました。実はこのノーブレークスペースは、半角スペースとは違う文字なのですが、プログラムで扱う上ではただの半角スペースにしか見えません。

試しにcharで見てみる

ということで先ほどの二つの文字列を文字コードにし、10進数で出力して見てみましょう。
String#getBytesで出来ます。

System.out.println(str1.getBytes(StandardCharsets.UTF_8));
// [104, 111, 103, 101, 32, 104, 111, 103, 101]
System.out.println(str2.getBytes(StandardCharsets.UTF_8));
// [104, 111, 103, 101, -62, -96, 104, 111, 103, 101]

「この数字ってなに?」と思った方は、 ASCIIコード表と見比べてみてください。文字列はUTF-8を想定してますが、半角アルファベットと半角スペースぐらいであれば、どの文字コードでも同じになります。

すると、本来スペースは32になるはずです。しかしstr2の半角スペースは-62 -96の2byteで表現されていますね。なので 半角スペースとノーブレークスペースは違う文字 ということになります。一見同じ文字にしか見えないので、完全に罠です。

Discussion