Perlでuse utf8したまま明示的に半角スペースを全角スペースに置き換える
#!/usr/bin/env perl use strict; use warnings; use utf8; use 5.010; use Encode qw(encode); # 半角スペースを明示的に全角スペースにする my $str = "ニューヨーク シティボーイ"; say encode('utf8', $str); # ニューヨーク シティボーイ $str =~ s/\s/\x{3000}/g; say encode('utf8', $str); # ニューヨーク シティボーイ
データベースに登録された氏名の苗字と名前の間が全角スペースのものがある。で、検索フォームから苗字と名前の間を半角スペースで入力した時にマッチさせたい、という要望に応えるために書きました。
use utf8プラグマを書くと \s が半角スペースにも全角スペースにもマッチする、というのは単純にスペース除去するときは便利。なんだけど、半角スペース←→全角スペースを置き換えたいとき、ちょっとつまづいちゃいました。
my $full_space = "\x{3000}";
↑このコードポイント表現で全角スペースを示せるので、それを使いました。
2018/7/21 追記
jitojitoさん、コメントありがとうございます。確かに半角スペースのみを厳密に指定するなら、そっちもコードポイントで記述するのがいいですね。
Perlでuse utf8したまま明示的に半角スペースを全角スペースに置き換える - Perl楽しいから好き\s はタブ文字なども含まれますので、半角空白のみなら /\x{0020}/\x{3000}/ とするほうが良いかもしれません。
2018/07/21 10:07
ということで書き直してみました。
↓
#!/usr/bin/env perl use strict; use warnings; use utf8; use 5.010; use Encode qw(encode); # 半角スペースを明示的に全角スペースにする my $str = "ニューヨーク シティボーイ"; say encode('utf8', $str); # ニューヨーク シティボーイ $str =~ s/\x{0020}/\x{3000}/g; say encode('utf8', $str); # ニューヨーク シティボーイ
イイ感じになりました。ありがとうございます!