ラボ > PHP:文字関連

php ハイフンに似た文字をハイフンに置き換える

ハイフンと同じような文字がそれなりに存在するので統一したい。unicodeで指定・置き換え。

作成日:2022-05-12, 更新日:2022-05-13

似た文字

文字 出力したunicode 置き換えるときに使うunicode unicode 内容
- &#x002d \u002d U+002D Hyphen-Minus: よく使われる普通の半角ハイフンマイナス
&#xfe63 \ufe63 U+FE63 小さいハイフンマイナス。NFKD/NFKC正規化で U+002D
&#xff0d \uff0d U+FF0D 全角ハイフンマイナス。NFKD/NFKC正規化で U+002D
ハイフン
­ &#x00ad \u00ad U+00AD Soft Hyphen: ソフトハイフン
&#x2010 \u2010 U+2010 Hyphen: U+002Dとは別の普通のハイフン
&#x2011 \u2011 U+2011 Non-Breaking Hyphen: 折り返しをしないハイフン。NFKD/NFKC正規化でU+2010になる
&#x2043 \u2043 U+2043 Hyphen Bullet: ビュレットとして使うハイフン(ビューレットとは箇条書きの先頭につける記号)
マイナス
˗ &#x02d7 \u02d7 U+02D7 Modifier Letter Minus Sign
&#x2212 \u2212 U+2212 Minus Sign: U+002Dとは別の普通のマイナス
⧿ &#x29ff \u29ff U+29FF Miny: (本当にマイナスなのかどうか詳細不明)
&#x2796 \u2796 U+2796 Heavy Minus Sign: 太いマイナス記号
ダッシュ
&#x2012 \u2012 U+2012 Figure Dash
&#x2013 \u2013 U+2013 En Dash: “n”と同じ横幅のダッシュ
&#x2014 \u2014 U+2014 Em Dash: “m”と同じ横幅のダッシュ
&#x2015 \u2015 U+2015 Horizontal Bar: クォーテーションダッシュ
&#x2e3a \u2e3a U+2E3A Two-Em Dash: “m”の2倍の横幅のダッシュ
&#x2e3b \u2e3b U+2E3B Three-Em Dash: “m”の3倍の横幅のダッシュ
&#xfe58 \ufe58 U+FE58 Small Em Dash: NFKD/NFKC正規化でU+2014になる
その他横線
&#x23af \u23af U+23AF Horizontal Line Extension
&#x23e4 \u23e4 U+23E4 Straightness: 直線を表す技術的な記号(として本当に使われるのか不明)
&#x268a \u268a U+268A Monogram for Yang: 中国の易経で使われる符号
𝄖 &#x1d116 \u1d116 U+1D116 Musical Symbol One-Line Staff: 五線譜にある5つの横線またはその上や下に書き足す横線(たぶん)
𝅽 &#x1d17d \u1d17d U+1D17D Musical Symbol Combining Tenuto: テヌート。音符の上や下に書き足す横線で、その音を十分に保つ印
罫線
&#x2500 \u2500 U+2500 Box Drawings Light Horizontal
&#x2501 \u2501 U+2501 Box Drawings Heavy Horizontal
&#x2574 \u2574 U+2574 Box Drawings Light Left
&#x2576 \u2576 U+2576 Box Drawings Light Right
&#x2578 \u2578 U+2578 Box Drawings Heavy Left
&#x257a \u257a U+257A Box Drawings Heavy Right
&#x257c \u257c U+257C Box Drawings Light Left and Heavy Right
&#x257e \u257e U+257E Box Drawings Heavy Left and Light Right
上付き横線(ハイフン/マイナスを含む)
¯ &#x00af \u00af U+00AF Macron: NFKD/NFKC正規化で U+0020 U+0304
ˉ &#x02c9 \u02c9 U+02C9 Modifier Letter Macron
&#x203e \u203e U+203E Overline: NFKD/NFKC正規化で U+0020 U+0305
&#x207b \u207b U+207B Superscript Minus: 上付きマイナス。NFKD/NFKC正規化で U+2212
&#x23ba \u23ba U+23BA Horizontal Scan Line-1
&#x23bb \u23bb U+23BB Horizontal Scan Line-3
&#x2594 \u2594 U+2594 Upper One Eighth Block: ブロック要素
&#xffe3 \uffe3 U+FFE3 Fullwidth Macron。NFKD/NFKC正規化で U+0020 U+0304
下付き横線(ハイフン/マイナスを含む)
_ &#005f \u005f U+005F Low Line: 半角アンダースコア(アンダーライン/アンダーバー/下線)
ˍ &#02cd \u02cd U+02CD Modifier Letter Low Macron
&#208b \u208b U+208B Subscript Minus: 下付きマイナス。NFKD/NFKC正規化で U+2212
&#23bc \u23bc U+23BC Horizontal Scan Line-7
&#23bd \u23bd U+23BD Horizontal Scan Line-9
&#2581 \u2581 U+2581 Lower One Eighth Block: ブロック要素
&#2582 \u2582 U+2582 Lower One Quarter Block: ブロック要素
&#2583 \u2583 U+2583 Lower Three Eighths Block: ブロック要素
&#2e0f \u2e0f U+2E0F Paragraphos
_ &#ff3f \uff3f U+FF3F Fullwidth Low Line: 全角アンダースコア(アンダーライン/アンダーバー/下線)。NFKD/NFKC正規化で U+005F
その他の東アジアの横線のような文字
&#x1173 \u1173 U+1173 Hangul Jungseong Eu: ハングルのウの発音を表す字母
&#x2f00 \u2f00 U+2F00 Kangxi Radical One: 漢字の部首としての”一”。NFKD/NFKC正規化でU+4E00になる
&#x30fc \u30fc U+30FC Katakana-Hiragana Prolonged Sound Mark: ひらがなカタカナの長音記号(長音符)
&#x3161 \u3161 U+3161 Hangul Letter Eu: ハングルのウの発音を表す字母。NFKD/NFKC正規化でU+1173になる
&#x3192 \u3192 U+3192 Ideographic Annotation One Mark: 日本での漢文の返り点”一”。NFKD/NFKC正規化でU+4E00になる
&#x31d0 \u31d0 U+31D0 Cjk Stroke H: 漢字の筆画としての”一”
&#x4e00 \u4e00 U+4E00 Cjk Unified Ideograph-4E00: 漢数字の”一”
&#xff70 \uff70 U+FF70 Halfwidth Katakana-Hiragana Prolonged Sound Mark:
半角カタカナ長音記号(長音符)。NFKD/NFKC正規化で全角の長音記号(U+30FC)になる
&#xffda \uffda U+FFDA Halfwidth Hangul Letter Eu: ハングルのウの発音の字母の半角。NFKD/NFKC正規化でU+1173になる

HTML出力するとき

Unicode文字が

  • 16進数コード文字列
    &#x(〇〇〇)
  • 10進数コード文字列
    &#(〇〇〇)

マルっと置換え(str_replace() or str_ireplace())

そのままだとできないらしい・・・
jsonの変換をそのまま使うとunicodeとして変換されるので、それを利用するっぽい
unicodeにした文字を戻す時もjsonの変換を利用

  1. 対象の文字列を「json_encode()」して最初と最後のカッコを取る
  2. 置き換える
  3. 「json_decode()」で戻す
// 文字列をunicodeに変換(※変換されたunicodeは小文字)
function codepoint_encode($str) {
  return substr(json_encode($str), 1, -1);
}

// unicodeから文字列に変換(※unicodeが大文字だったら変換不可)
function codepoint_decode($str) {
  return json_decode(sprintf('"%s"', $str));
}

// ===============================================
// ハイフンに似た文字一覧(大文字じゃなく小文字にしておく)
$seed = array(
  // ▼使った文字: https://hydrocul.github.io/wiki/blog/2014/1101-hyphen-minus-wave-tilde.html
  '-', // U+002D json_encodeしても「-」のままなので、置換え対象に含まれるようにそのまま追加
  '\u002d', // U+002D Hyphen-Minus: よく使われる普通の半角ハイフンマイナス
  '\ufe63', // U+FE63 小さいハイフンマイナス。NFKD/NFKC正規化で U+002D
  '\uff0d', // U+FF0D 全角ハイフンマイナス。NFKD/NFKC正規化で U+002D

  // ハイフン
  '\u00ad', // U+00AD Soft Hyphen: ソフトハイフン
  '\u2010', // U+2010 Hyphen: U+002Dとは別の普通のハイフン
  '\u2011', // U+2011 Non-Breaking Hyphen: 折り返しをしないハイフン。NFKD/NFKC正規化でU+2010になる
  '\u2043', // U+2043 Hyphen Bullet: ビュレットとして使うハイフン(ビューレットとは箇条書きの先頭につける記号)

  // マイナス
  '\u02d7', // U+02D7 Modifier Letter Minus Sign
  '\u2212', // U+2212 Minus Sign: U+002Dとは別の普通のマイナス
  '\u29ff', // U+29FF Miny: (本当にマイナスなのかどうか詳細不明)
  '\u2796', // U+2796 Heavy Minus Sign: 太いマイナス記号

  // ダッシュ
  '\u2012', // U+2012 Figure Dash
  '\u2013', // U+2013 En Dash: “n”と同じ横幅のダッシュ
  '\u2014', // U+2014 Em Dash: “m”と同じ横幅のダッシュ
  '\u2015', // U+2015 Horizontal Bar: クォーテーションダッシュ
  '\u2e3a', // U+2E3A Two-Em Dash: “m”の2倍の横幅のダッシュ
  '\u2e3b', // U+2E3B Three-Em Dash: “m”の3倍の横幅のダッシュ
  '\ufe58', // U+FE58 Small Em Dash: NFKD/NFKC正規化でU+2014になる

  // その他横線
  '\u23af', // U+23AF Horizontal Line Extension
  '\u23e4', // U+23E4 Straightness: 直線を表す技術的な記号(として本当に使われるのか不明)
  '\u268a', // U+268A Monogram for Yang: 中国の易経で使われる符号
  '\u1d116', // U+1D116 Musical Symbol One-Line Staff: 五線譜にある5つの横線またはその上や下に書き足す横線(たぶん)
  '\u1d17d', // U+1D17D Musical Symbol Combining Tenuto: テヌート。音符の上や下に書き足す横線で、その音を十分に保つ印

  // 罫線
  '\u2500', // U+2500 Box Drawings Light Horizontal
  '\u2501', // U+2501 Box Drawings Heavy Horizontal
  '\u2574', // U+2574 Box Drawings Light Left
  '\u2576', // U+2576 Box Drawings Light Right
  '\u2578', // U+2578 Box Drawings Heavy Left
  '\u257a', // U+257A Box Drawings Heavy Right
  '\u257c', // U+257C Box Drawings Light Left and Heavy Right
  '\u257e', // U+257E Box Drawings Heavy Left and Light Right

  // 上付き横線(ハイフン/マイナスを含む)
  '\u00af', // U+00AF Macron: NFKD/NFKC正規化で U+0020 U+0304
  '\u02c9', // U+02C9 Modifier Letter Macron
  '\u203e', // U+203E Overline: NFKD/NFKC正規化で U+0020 U+0305
  '\u207b', // U+207B Superscript Minus: 上付きマイナス。NFKD/NFKC正規化で U+2212
  '\u23ba', // U+23BA Horizontal Scan Line-1
  '\u23bb', // U+23BB Horizontal Scan Line-3
  '\u2594', // U+2594 Upper One Eighth Block: ブロック要素
  '\uffe3', // U+FFE3 Fullwidth Macron。NFKD/NFKC正規化で U+0020 U+0304

  // 下付き横線(ハイフン/マイナスを含む)
//  '\u005f', // U+005F Low Line: 半角アンダースコア(アンダーライン/アンダーバー/下線)
  '\u02cd', // U+02CD Modifier Letter Low Macron
  '\u208b', // U+208B Subscript Minus: 下付きマイナス。NFKD/NFKC正規化で U+2212
  '\u23bc', // U+23BC Horizontal Scan Line-7
  '\u23bd', // U+23BD Horizontal Scan Line-9
  '\u2581', // U+2581 Lower One Eighth Block: ブロック要素
  '\u2582', // U+2582 Lower One Quarter Block: ブロック要素
  '\u2583', // U+2583 Lower Three Eighths Block: ブロック要素
  '\u2e0f', // U+2E0F Paragraphos
//  '\uff3f', // U+FF3F Fullwidth Low Line: 全角アンダースコア(アンダーライン/アンダーバー/下線)。NFKD/NFKC正規化で U+005F

  // その他の東アジアの横線のような文字
  '\u1173', // U+1173 Hangul Jungseong Eu: ハングルのウの発音を表す字母
  '\u2f00', // U+2F00 Kangxi Radical One: 漢字の部首としての”一”。NFKD/NFKC正規化でU+4E00になる
//  '\u30fc', // U+30FC Katakana-Hiragana Prolonged Sound Mark: ひらがなカタカナの長音記号(長音符)
  '\u3161', // U+3161 Hangul Letter Eu: ハングルのウの発音を表す字母。NFKD/NFKC正規化でU+1173になる
  '\u3192', // U+3192 Ideographic Annotation One Mark: 日本での漢文の返り点”一”。NFKD/NFKC正規化でU+4E00になる
  '\u31d0', // U+31D0 Cjk Stroke H: 漢字の筆画としての”一”
//  '\u4e00', // U+4E00 Cjk Unified Ideograph-4E00: 漢数字の”一”
  '\uff70', // U+FF70 Halfwidth Katakana-Hiragana Prolonged Sound Mark: 半角カタカナ長音記号(長音符)。NFKD/NFKC正規化で全角の長音記号(U+30FC)になる
  '\uffda', // U+FFDA Halfwidth Hangul Letter Eu: ハングルのウの発音の字母の半角。NFKD/NFKC正規化でU+1173になる
);

$orig_char = xxxxxxxxx;

// 入力された文字列をunicodeに変換(「-(U+002D)」はエンコードしても「-」のまま)
$ipt_unicode = codepoint_encode($orig_char);
// var_export($ipt_unicode);

$use_char = '\u002d'; // 「\u002d」「\uff0d」のどちらかに置換えれば大丈夫っぽそう
// $use_char = strtolower($use_char); // json_decode()のコトを考え強制的に小文字にしておく

$rep_unicode = str_ireplace($seed, $use_char, $ipt_unicode); // $seedの中のunicode指定が大文字・小文字混在しても問題無しにしたいとき

// 置き換え完了したので、unicodeをデコード
$result = codepoint_decode($rep_unicode);
// var_export($result);

雑記

unicodeが大文字なら「json_decode()」しても元の文字に戻らない
→「\u2500」は「─」に変換されるが、「\U2500」は「\U2500」のまま