1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

振込の受取人名を「銀行で通る半角カナ」に変換するときの落とし穴7つ(JavaScript)

1
Last updated at Posted at 2026-10-20

総合振込や給与振込のデータ(全銀フォーマット)を作るとき、受取人名は「半角カナ・英大文字・数字と一部の記号」で書く必要があります。台帳のフリガナをそのまま半角にすれば済みそうに見えますが、実際には銀行で弾かれる文字がいくつも残ります。

この記事では、口座名義を半角カナに変換する処理を JavaScript で書いたときに詰まった点を7つまとめます。最後に、依存ライブラリなしで動く変換関数を載せています。

この記事は、生成AI(Claude)を使って書いた下書きを、銀行の公開資料と実際の動作で確認してから投稿しています。

前提: 受取人名に使える文字

金融機関の案内では、次のように説明されています。

  • 使える文字: 半角カナ、半角英大文字、半角数字、半角スペース、半角記号 \ . 「 」 ( ) - /
  • 半角30文字以内。濁点・半濁点付きのカナは2文字として数える
  • 「,」(カンマ)は通常の振込では使えるが、総合振込・給与振込では使えない

(出典: あいち銀行 FAQ。細かな扱いは金融機関ごとに違うので、使う銀行の案内も確認してください)

落とし穴1: NFKC 正規化は「半角カナ → 全角カナ」方向にしか働かない

String.prototype.normalize('NFKC') を使うと、全角英数字が半角になり、全角スペースも半角スペースになるので便利です。ただし、カナは逆方向で、半角カナが全角カナに変わります。

'ヤマダ TARO'.normalize('NFKC'); // 'ヤマダ TARO'

そこで「最初に NFKC で全角カナにそろえ、置換をすべて済ませてから、最後に自前の表で半角カナに戻す」という順番にします。入力に半角カナと全角カナが混ざっていても、同じ処理で扱えます。

落とし穴2: 濁点は別の文字になり、30桁の数え方が変わる

半角カナには「ガ」にあたる1文字がなく、カ と ゙ の2文字で表します。全角で15文字の名義が、半角にすると30桁を超えることがあります。桁数のチェックは、半角に変換した後の文字列で行います。

[...'グリーン'].length; // 5(グリーン は全角だと4文字)

落とし穴3: 小さい文字(ャ・ッ・ァ)は使えない

受取人名の文字には小書きのカナが含まれません。三井住友銀行のヘルプでも、促音・拗音は大きい文字(ツ・ヤ・ユ・ヨ)に置き換えて表示されると案内されています。ショウジ ではなく シヨウジ にします。

落とし穴4: 長音「ー」はハイフンに

長音記号は使える文字に含まれないため、半角ハイフン - に置き換えます。「センター」は センタ- になります。全角の「-」「〜」なども、同じくハイフンにそろえておくと安全です。

落とし穴5: 法人格は略語にし、位置で括弧の向きが変わる

法人の口座名義では「株式会社」を カ のような略語で書き、名称の前にあるか後にあるかで括弧の付け方が変わります。

名義 受取人名
株式会社ツールバコ カ)ツ-ルバコ
ツールバコ株式会社 ツ-ルバコ(カ
ツールバコ株式会社トウキョウシテン ツ-ルバコ(カ)トウキヨウシテン

主な略語: 株式会社 カ、有限会社 ユ、合同会社 ド、医療法人 イ、一般社団法人 シヤ、特定非営利活動法人 トクヒ など(東京都・大阪市が公表している法人略語一覧による)。

落とし穴6: 略語は「いちばん長く一致するもの」を1つだけ

「社会医療法人」には「医療法人」が含まれます。短い方から順に探すと、「社会医療法人サクラカイ」が シヤカイ(イ)サクラカイ のような誤った結果になります(正しくは イ)サクラカイ)。略語の表を文字数の長い順に並べて、最初に一致したもの1つだけを置き換えます。

落とし穴7: カンマは振込の種類によって可否が変わる

前提で書いたとおり、「,」は通常の振込では通っても、総合振込・給与振込では弾かれる金融機関があります。全銀フォーマットのファイルを作る用途なら、カンマは「使えない文字」として扱い、人が直すようにしておく方が安全です。

変換関数(依存なし)

// 全角カナ → 半角カナの表(濁音・半濁音は2文字になる)
const FULL = 'アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲン';
const HALF = 'アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲン';
const TO_HALF = new Map([...FULL].map((c, i) => [c, HALF[i]]));
for (const c of 'カキクケコサシスセソタチツテトハヒフヘホ') {
  const code = c.charCodeAt(0);
  TO_HALF.set(String.fromCharCode(code + 1), TO_HALF.get(c) + '゙'); // ガ = カ の次の文字
  if ('ハヒフヘホ'.includes(c)) TO_HALF.set(String.fromCharCode(code + 2), TO_HALF.get(c) + '゚'); // パ
}
TO_HALF.set('ヴ', 'ヴ');

const SMALL = { ァ: 'ア', ィ: 'イ', ゥ: 'ウ', ェ: 'エ', ォ: 'オ', ッ: 'ツ', ャ: 'ヤ', ュ: 'ユ', ョ: 'ヨ', ヮ: 'ワ', ヵ: 'カ', ヶ: 'ケ' };

// 法人略語(一部)。長い順に並べ替えて、最長一致にする
const ABBR = [
  ['株式会社', 'カ'], ['カブシキガイシャ', 'カ'], ['カブシキカイシャ', 'カ'],
  ['有限会社', 'ユ'], ['ユウゲンガイシャ', 'ユ'],
  ['合同会社', 'ド'], ['ゴウドウガイシャ', 'ド'],
  ['医療法人社団', 'イ'], ['医療法人', 'イ'], ['社会医療法人', 'イ'],
  ['一般社団法人', 'シヤ'], ['特定非営利活動法人', 'トクヒ'],
].sort((a, b) => b[0].length - a[0].length);

const ALLOWED = /[0-9A-Zア-ンヺ゚ ().\-\/\\「」]/;

function toZenginKana(src) {
  let s = src.normalize('NFKC'); // 全角英数→半角、半角カナ→全角カナ
  s = s.replace(/[ぁ-ゖ]/g, c => String.fromCharCode(c.charCodeAt(0) + 0x60)); // ひらがな→カタカナ
  s = s.replace(/\s+/g, ' ').trim();

  // 法人略語は1名義に1つ。前なら「カ)」、後なら「(カ」、途中なら「(カ)」
  for (const [word, ab] of ABBR) {
    const t = s.replace(/ /g, '');
    const i = t.indexOf(word);
    if (i < 0) continue;
    const before = t.slice(0, i), after = t.slice(i + word.length);
    s = before + (!before ? ab + ')' : !after ? '(' + ab : '(' + ab + ')') + after;
    break;
  }

  s = s.toUpperCase()
    .replace(/[ー‐―−〜~]/g, '-') // NFKC で「~」は「~」になっている
    .replace(/・/g, '.')
    .replace(/「/g, '「').replace(/」/g, '」')
    .replace(/[ァィゥェォッャュョヮヵヶ]/g, c => SMALL[c]);
  s = [...s].map(c => TO_HALF.get(c) ?? c).join('');

  const bad = [...new Set([...s].filter(c => !ALLOWED.test(c)))];
  return { kana: s, length: [...s].length, bad };
}

実行例です(名義はすべて架空です)。

toZenginKana('カブシキガイシャ ヤマダショウジ'); // { kana: 'カ)ヤマダシヨウジ', length: 11, bad: [] }
toZenginKana('やまだ はなこ');                   // { kana: 'ヤマダ ハナコ', length: 8, bad: [] }
toZenginKana('合同会社グリーンファーム');         // { kana: 'ド)グリ-ンフア-ム', length: 12, bad: [] }
toZenginKana('サンプルセンター株式会社トウキョウシテン'); // { kana: 'サンプルセンタ-(カ)トウキヨウシテン', length: 20, bad: [] }
toZenginKana('タナカ ケン&カンパニー');                  // { kana: 'タナカ ケン&カンパニ-', length: 13, bad: ['&'] }

bad に文字が入った名義は、自動では直さずに人が確認する前提です(「&」を「アンド」にするか消すかは、口座ごとの登録内容によるため)。

注意

  • 変換結果が、銀行に登録されている口座名義と一致するとは限りません。初めての振込先は、請求書などに書かれた口座名義と照らし合わせてください。
  • 「ヲ」が使えない、略語の扱いが違う、などの差が金融機関ごとにあります。

ブラウザで試す

上の処理に、法人略語の全一覧(25種)と、複数行の一括変換、使えない文字の表示を加えたものを、無料の Web ツールとして公開しています。入力はブラウザの中だけで処理し、どこにも送信しません。


振込カナに加えて、営業日(祝日・振替休日・銀行休業日)・和暦・消費税の端数・CSV の文字化けを、公式資料の出典とテストつきでまとめた本を Zenn で公開しました。この記事の内容は、本の無料の章でより詳しく扱っています。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?