2025.01.30
ハイフンの種類について
はじめに
仕事で色々なシステムからデータを集約する機会があったのですが、ハイフンの取り扱いがシステムによって違っていて、大変な目に遭いました。
比較的良く見るものだけでも、こんなに種類があります。
ハイフンの統一サンプルはこちら。
ハイフン(-)の種類と用途
ハイフン(-)は、文章やデザインの中で使われる記号ですが、実は複数の種類があり、それぞれ異なる用途や特徴を持っています。
恥ずかしながら最初のハイフンと半角カナハイフンは同じものだと思っていましたが、別ものだったんですね…
ハイフンの種類
ハイフン (-)
- 文字コード: U+002D
- 幅: 狭い
- 用途:
- 単語の分割(例: e-mail)
- 複合語(例: mother-in-law)
- 電話番号や数字の区切り(例: 123-456-7890)
- 備考: 一般的なハイフンで、キーボード上で直接入力できるものです。
エヌダッシュ (–)
- 文字コード: U+2013
- 幅: ハイフンより少し広い
- 用途:
- 範囲を表す(例: 2020–2025、月曜–金曜)
- 比較的小さな区切りの表現
- 備考: ハイフンの代わりに使うとより洗練された印象を与えることがあります。
エムダッシュ (—)
- 文字コード: U+2014
- 幅: エヌダッシュよりさらに広い
- 用途:
- 文中の挿入句や追加情報の区切り(例: "彼は—実際には—そのことを知っていた。)
- 強調やリズムのための分割
- 備考: 文書内でスタイルを強調するために使われます。日本語文章ではあまり使われませんが、英語では一般的です。
マイナス記号 (−)
- 文字コード: U+2212
- 幅: ハイフンより少し広い
- 用途:
- 数学の引き算や負の数を表現(例: −5)
- 備考: ハイフンと混同されやすいですが、数学的にはこちらが適切です。
全角ハイフン(ー)
- 文字コード: U+FF0D
- 幅: 全角
- 用途:
- 日本語入力時の全角文字に合わせたハイフン
- 一部のデザインや特定の文書で使われることがある
- 備考: 見た目を全角に揃えたい場合に使われますが、必要がない場合は避けるのが一般的です。
半角カナハイフン (ー)
- 文字コード: U+FF70
- 幅: 半角
- 用途:
- 半角カタカナの長音記号(例: コード、パーティー)
- 主に日本語での半角カタカナ表記に使用
- 特徴:
- 長音(伸ばし棒)としての用途に特化した記号です。
- 注意点: 通常のハイフン(U+002D)とは異なり、専らカタカナ表記専用です。文章全体で半角カタカナを使う場合のみ使用を推奨します。
ハイフンの選び方のポイント
- 用途を明確にする:範囲や区切り、スタイルなど目的に合わせて選びます。
- フォーマットの一貫性を保つ:異なるハイフンを混ぜないよう注意します。
- デザインや見た目の調整:エヌダッシュやエムダッシュを使うと、よりプロフェッショナルな印象を与えられる場合があります。
ハイフンの統一サンプル
ハイフンに似た横棒(–、—、−、- など 24 種類)を、半角のハイフン「-」(U+002D) にそろえるサンプルです。長音記号の「ー」「ー」は、直前が英数字のとき(「03ー1234」など)だけ置き換えるので、「コード」のようなカタカナ語は壊れません。右上の「コピー」でそのまま使えます。
Javaのハイフンの統一サンプルプログラム
import java.util.regex.Pattern;
public class HyphenNormalizer {
// いつでも半角ハイフン「-」(U+002D) に置き換える横棒
private static final Pattern DASHES = Pattern.compile(
"[\\x{02D7}\\x{1B78}\\x{2010}-\\x{2015}\\x{2043}\\x{207B}\\x{2212}\\x{2500}\\x{2501}"
+ "\\x{25AC}\\x{2796}\\x{FE58}\\x{FE63}\\x{FF0D}\\x{10110}\\x{10191}]");
// 長音記号「ー」「ー」とハングルの横棒は、直前が英数字のときだけ置き換える
// (「コード」の「ー」まで置き換えると「コ-ド」になってしまうため)
private static final Pattern LONG_VOWELS = Pattern.compile(
"(?<=[0-9A-Za-z0-9A-Za-z])[\\x{30FC}\\x{FF70}\\x{1173}\\x{3161}]");
/** ハイフンに似た横棒を、半角ハイフン「-」(U+002D) に統一する。 */
public static String normalize(String text) {
if (text == null) {
return null;
}
String result = DASHES.matcher(text).replaceAll("-");
return LONG_VOWELS.matcher(result).replaceAll("-");
}
public static void main(String[] args) {
String[] samples = {
"03ー1234−5678",
"123ー4567",
"A‐B–C—D―E",
"コード・パーティー",
"〒100-0001",
"コード",
"x𐄐y𐆑z",
};
for (String s : samples) {
System.out.println(s + " → " + normalize(s));
}
}
}PHPのハイフンの統一サンプルプログラム
<?php
/**
* ハイフンに似た横棒を、半角ハイフン「-」(U+002D) に統一する。
*/
function normalizeHyphen(?string $text): ?string
{
if ($text === null) {
return null;
}
// いつでも置き換える横棒
$text = preg_replace(
'/[\x{02D7}\x{1B78}\x{2010}-\x{2015}\x{2043}\x{207B}\x{2212}\x{2500}\x{2501}'
. '\x{25AC}\x{2796}\x{FE58}\x{FE63}\x{FF0D}\x{10110}\x{10191}]/u',
'-',
$text
);
// 長音記号「ー」「ー」とハングルの横棒は、直前が英数字のときだけ置き換える
// (「コード」の「ー」まで置き換えると「コ-ド」になってしまうため)
return preg_replace(
'/(?<=[0-9A-Za-z0-9A-Za-z])[\x{30FC}\x{FF70}\x{1173}\x{3161}]/u',
'-',
$text
);
}
$samples = [
'03ー1234−5678',
'123ー4567',
'A‐B–C—D―E',
'コード・パーティー',
'〒100-0001',
'コード',
'x𐄐y𐆑z',
];
foreach ($samples as $s) {
echo $s . ' → ' . normalizeHyphen($s) . PHP_EOL;
}JavaScriptのハイフンの統一サンプルプログラム
// いつでも半角ハイフン「-」(U+002D) に置き換える横棒
const DASHES =
/[˗᭸‐-―⁃⁻−─━▬➖﹘﹣-\u{10110}\u{10191}]/gu
// 長音記号「ー」「ー」とハングルの横棒は、直前が英数字のときだけ置き換える
// (「コード」の「ー」まで置き換えると「コ-ド」になってしまうため)
const LONG_VOWELS = /(?<=[0-9A-Za-z0-9A-Za-z])[ーーᅳㅡ]/gu
/**
* ハイフンに似た横棒を、半角ハイフン「-」(U+002D) に統一する。
*/
function normalizeHyphen(text) {
if (text == null) return text
return text.replace(DASHES, '-').replace(LONG_VOWELS, '-')
}
const samples = [
'03ー1234−5678',
'123ー4567',
'A‐B–C—D―E',
'コード・パーティー',
'〒100-0001',
'コード',
'x𐄐y𐆑z',
]
for (const s of samples) {
console.log(`${s} → ${normalizeHyphen(s)}`)
}これ以外にもハイフンはいっぱいあります!
以下ハイフンの統合サンプルプログラムを書いていらっしゃる方がいたので、URL共有します。
自分もこれを参考にしました。

ハイフンに似ている横棒を全て統一するᅳㅡ˗𐆑–᭸‒-─−▬𐄐—━‐‑ー﹣―ー﹘-⁃➖⁻! - Qiita
はじめに これらの横棒、コンピュータにとっては全て違うのですが 見分けがつくでしょうか? -˗ᅳ᭸‐‑‒–—―⁃⁻−▬─━➖ーㅡ﹘﹣-ー𐄐𐆑 郵便番号、住所、電話番号など、横棒が使われているデータを扱うとき、 人が入力したデータや購入したデータであると、同じ記号が使われて...
qiita.com
