レビューを依頼する
Japanese Input · IME · Form Fields

日本語IME・テキスト入力のローカライゼーション:
全角・半角・変換がフォームを壊す

日本語はIMEを通して入力され、複数の文字種が混ざり、しかもバリデーションが想定していない全角文字がしばしば使われます。その結果、有効な日本語の氏名を弾いたり、変換の途中でエラーを出したり、ASCIIが必要ない場面でASCIIを要求したりするフォームが、静かに増えています。本記事では、日本のSaaSのフォームを壊す入力の仕組みと、それをネイティブに感じさせる直し方を整理します。

Munehiro Hiraki
Munehiro Hiraki
Japanese Localization QA Specialist
2026年6月12日 読了10分 日本語フォーム・入力
クイックアンサー
なぜフォームが有効な日本語の氏名や数字を弾くのですか?
原因の多くは全角・半角の扱いにあります。日本のユーザーは、IMEが既定で生成する全角の数字(090)や@をよく打ちます。ASCII限定のバリデーションは、こうした有効な入力を弾いてしまいます。直し方は、入力をブロックするのではなく、検証の前に全角を半角へ正規化することです。
なぜユーザーが入力し終える前に検証が発火するのですか?
日本語は変換フェーズを持つIMEを通して入力されます。キー入力のたびに検証すると、未確定のテキストに対して変換中に発火します。compositionstart/compositionendを監視し、変換が確定した後にのみ検証してください。
半角入力を強制するためにCSSのime-modeを使うべきですか?
いいえ。ime-modeは非推奨で不安定です。標準のinputmode属性をヒントとして使い、IMEを抑制しようとするのではなくコードで全角入力を正規化してください。

要点(TL;DR)

日本語のテキスト入力は、英語前提のバリデーションが想定していない3つのレイヤーでSaaSのフォームを壊します。文字幅:日本のユーザーはIMEが生成する全角の数字(090)や全角記号(@)を日常的に打つため、ASCII限定のバリデーションは有効な入力を弾きます。直し方は弾くのではなく正規化することです。変換のタイミング:日本語は読みを打って確定する変換フェーズを持つIMEを通して入力されるため、キー入力単位のバリデーションは途中のテキストに発火します。直し方はcompositionstart/compositionendを監視し、確定後にのみ検証することです。フィールド設計:フリガナはIMEの読みから自動入力し、郵便番号や電話番号は両方の幅を受け付け、CSSのime-mode(非推奨)はinputmodeヒントに置き換えます。ヘルプ文で案内し、正規化で担保します。

キーポイント

  • 全角入力は普通であり、エラーではありません — 多くのモードでIMEは既定で全角の数字や記号を生成します。有効な日本語入力を弾くのではなく、検証前に全角を半角へ正規化しましょう。
  • バリデーションはIMEの確定を待たなければなりません — キー入力単位の検証は変換中に発火します。compositionstartとcompositionendを使い、ユーザーが確定するまで検証を抑制します。
  • CSSのime-modeは非推奨です — 半角強制やIME無効化のためにこれに依存しないでください。標準のinputmode属性をヒントとして使い、コードで正規化します。
  • フリガナはIMEの読みから自動入力すべきです — 確定した読みを取得すれば、氏名を二度打つ手間が省け、ネイティブ品質を示す強いシグナルになります。
  • 「スペース不可・ASCIIのみ」は有効な日本語を弾きます — 日本人の氏名には中黒や姓名間のスペース、漢字、かなが含まれます。英語向けの幅・スクリプト制限は、実在するユーザーを気づかないうちに締め出してしまいます。
  • ヘルプ文は罰するのではなく案内すべきです — 期待する幅とスクリプトを入力前に例とともに示し、ブロックではなく静かに正規化します。

IMEの実際の仕組みと、それがフォームに重要な理由

日本語はラテン文字のようには直接打てません。漢字は数千あり、数千のキーを持つキーボードは存在しないため、日本語入力はIME(Input Method Editor)を通して行われます。ユーザーが読みを打ち、IMEが変換候補を表示し、ユーザーが選んで確定します。確定して初めて、最終的なテキストがフィールドに入ります。キー入力と確定済みテキストの間にはギャップがあり、このギャップこそが日本語フォームのバグの大半の根本原因です。

具体的には、「開」という氏名を入力するときは、いくつかの段階を踏みます。ユーザーが hiraki と打つと「ひらき」(ひらがな)が表示され、スペースで変換し、候補リスト(開、開き、ひらき…)が出て、「開」を選び、Enterで確定します。最初のキー入力から最後のEnterまで、フィールドには未確定の途中テキストが入っています。ブラウザはこのライフサイクルをcompositionstart、compositionupdate、compositionendのイベントで公開しています。これらを無視するフォームのロジックは、ユーザーがまだ入力し終えていないテキストを相手にしていることになります。

2つ目は文字幅です。IMEはモードによっては、数字やASCII記号も含めて、既定で全角の形で文字を生成します。電話番号を入力するユーザーは、本人が意図しないまま、09012345678ではなく09012345678になったり、メールが@ではなく@になったりすることがあります。ユーザーにはこれが正しく見えますが、ASCII限定のバリデーションには無効な入力に見えます。

全角と半角:数字と記号の罠

全角・半角の区別は、「このフォームは日本語ユーザーを嫌っている」という声が最も多く上がる原因です。全角文字はCJK文字1つ分の見た目の幅を占め、半角は見慣れたASCII幅の形です。日本語のキーボードやIMEはこれらを切り替えますが、ユーザーがどちらを生成するかは、IMEのモードやデバイス、習慣で決まるもので、バリデーションが期待するものとは何の関係もありません。

問題が表面化するのは、まさにASCIIを前提にしたフィールドです。電話番号、郵便番号、クレジットカード番号、メールアドレスです。/^[0-9]+$/ のような正規表現は半角の数字にしか一致せず、ユーザーが有効な電話番号を打っているのに090を弾いてしまいます。正しい対応はほぼ常に、弾くことではなく正規化することです。検証の前に全角の数字とラテン文字を半角に変換し、090と090が同じ保存値になるようにします。

全角・半角
ASCII限定のバリデーションが静かに失敗する、全角・半角の分かれ目
3
テキストがいつ確定するかを司る変換イベント(compositionstart/update/end)
ime-mode
使うのをやめるべきCSSプロパティ——現代のブラウザで非推奨かつ不安定

正規化は一貫したやり方で、1か所にまとめて適用すべきです。最も堅牢なのは、サーバー側を確かな正本として正規化し、必要に応じてフィールドのblurやchangeイベントでブラウザ側でも正規化して、ユーザーにすぐフィードバックを返すパターンです。やってはいけないのは、ユーザーが変換している最中にIMEと競合する形で正規化することです。ちらつきや文字落ちの原因になります。値が落ち着いてから正規化し、正規化した値を検証し、正規化した形で保存します。

ビフォー(ASCII限定のバリデーション)
電話番号: 09012345678 → エラー「半角で入力してください」
ユーザーは全角で有効な番号を打ったのに、叱るようなエラーでブロックされます。数字が正しく見えるため、多くのユーザーはなぜ弾かれたのか分かりません。
アフター(正規化してから検証)
09012345678 → 09012345678(自動正規化)→ 受付完了
全角の数字を検証前に半角へ変換します。ユーザーは、自分で意識的に選んだわけではない幅のせいでブロックされることがありません。

変換イベント:なぜ変換中にバリデーションが発火するのか

日本語フォームで最も苛立つバグは、まだ名前を打っている最中に出るエラーです。これは、フォームが input や keyup のイベントで検証しているために起こります。これらのイベントはキー入力のたびに発火し、IMEがまだ最終的な変換を処理している途中の読みのキー入力も含まれます。バリデーターは「ひらき」や「ひら」だけを見て誤りと判断し、ユーザーが何も確定していないのにエラーを出してしまいます。

標準的な直し方は、変換のライフサイクルを使うことです。compositionstart が発火したら、検証を抑制するフラグを立てます。compositionend が発火したら、ユーザーは変換を確定しているので、フラグを解除して確定済みの値を検証します。原則はシンプルです。IMEが変換し終えていないテキストは決して検証しない。この1つの変更で、「入力中にエラー」という苦情がまるごと消えます。

ビフォー(キー入力のたびに検証)
入力中: ひら… → 即エラー「正しく入力してください」
変換中にバリデーションが発火します。これから漢字の氏名に変換しようとしている途中の読みに対して、エラーが表示されます。
アフター(compositionendで検証)
入力中は検証を抑制 → 確定(開)→ 検証 → OK
バリデーションはIMEの変換が確定するまで待ちます。ユーザーはエラーが出る前に氏名を打ち終えられます。

同じ仕組みが、優れたフリガナ自動入力にもつながります。2つの問題は、実は1つの問題なのです。変換イベントを正しく扱うフォームは、早すぎる検証を抑えることと、確定した読みを取得することの両方ができます。これらを無視するフォームは、どちらもできません。

フリガナ・カナフィールド:読みから自動入力する

氏名を収集する日本語のフォームは、ほぼ必ずフリガナ(フリガナ/ふりがな)フィールド、つまり氏名の読みも集めます。これは冗長なものではありません。「開」のような漢字の氏名には複数の読み方があり、企業は並べ替えや宛名、電話応対のために読みを必要とします。氏名を二度、漢字で一度、かなで一度打たせるのは、はっきりと認識される摩擦点です。

よくできた日本語のフォームは、ユーザーがIMEに打ち込んだ読みからフリガナを自動入力します。ユーザーが hiraki を「開」に変換するとき、読み「ひらき」はまさに本人が打った文字列で、変換イベントを通して取得できます。その読みをフリガナフィールドに書き込み、フィールドがカナを期待していればカタカナへ変換すれば、ひと手間まるごと省けます。ユーザーはこれにすぐ気づきます。英語フォームの翻訳ではなく、日本語入力を理解している人が作ったフォームだという証です。

ビフォー(手動の二重入力)
お名前: 開 / フリガナ: (空欄、手入力を要求)
ユーザーは氏名を打ってから、読みを別に打ち直さなければなりません。フリガナフィールドはカナのみで検証されるため、ユーザーが何を求められているか分かる前にエラーが出ることもよくあります。
アフター(IMEの読みから自動入力)
お名前: 開 → フリガナ: ヒラキ(自動入力)
IMEから確定した読みを取得し、自動でカタカナへ変換します。必要なら修正できますが、その必要はほとんどありません。

入力モードのヒント:非推奨のime-modeではなくinputmode

長年、開発者はCSSの ime-mode プロパティを使い、数字の郵便番号フィールドなどで、フィールドを半角に強制したり、IMEを完全に無効化したりしようとしてきました。このプロパティは非推奨であり、現代の標準からは外れています。ブラウザ間で挙動が一貫せず、現在のどの実装にも組み込むべきではありません。これに依存すると、あるブラウザでは動き、別のブラウザでは静かに失敗するフィールドができてしまいます。

サポートされている標準的な方法はinputmode属性です。フィールドが期待する入力の種類を、ブラウザやソフトウェアキーボードにヒントとして伝えます。郵便番号には inputmode="numeric"、メールフィールドには inputmode="email" などです。モバイルではこれが適切なキーボードを表示し、デスクトップではヒントになります。重要なのは、inputmodeはあくまでヒントであって保証ではないという点です。ユーザーは依然として全角文字を生成できます。だからこそinputmodeは正規化と組み合わせる必要があります。期待する入力をヒントで示し、届いたものを正規化する。この2つを合わせることが、古くて壊れたime-modeのやり方に取って代わります。

フィールド 期待する入力 推奨アプローチ 備考
電話番号 半角数字 inputmode="tel" + 全角→半角 正規化 全角の数字を受け付けて正規化。090形式の入力を決してブロックしない。
郵便番号 半角数字(7桁) inputmode="numeric" + 正規化 ハイフンを除去するか、1234567と123-4567の両方を受け付ける。
メール 半角英数記号 inputmode="email" + @等の正規化 検証前に全角の@やラテン文字を半角へ変換する。
氏名(漢字) 漢字・かな 幅・スクリプト制限を緩める ASCIIや「スペース不可」を強制しない。日本人の氏名にはスペースと漢字が含まれる。
フリガナ カナ/かな IME読みから自動入力 + かな⇄カナ変換 読みから自動入力。ひらがな・カタカナの両方を受け付け、期待する側へ正規化する。
自由記述コメント 全角・半角混在 幅の制限をしない 日本語の文章では混在幅が普通。ここでは正規化も制限もしない。

この表から見えてくるのは、すべてのフィールドに共通の「正しい」幅など存在しないというルールです。数字フィールドは半角へ正規化すべきで、氏名や自由記述のフィールドは混在幅をそのまま受け付けるべきです。一律に「すべて半角に変換」するルールは、一律に「全角を弾く」ルールと同じくらい誤っています。日本人の氏名や文章を壊してしまうからです。幅の扱いはフィールドごとに、そのフィールドが実際に何を保存するかで決まります。

予測変換と貼り付け入力

基本の変換ケースを扱えるフォームでも、さらに2つの挙動でつまずきます。1つ目は予測変換です。現代のIMEはユーザーが打ち終える前に補完を提案し、提案を採用すると、通常の変換とは少し異なるイベント経路でテキストが確定することがあります。フォームは、各予測キー入力を解釈しようとするのではなく、compositionend時(または後続のinput/change)の値を正本として扱うべきです。

2つ目は貼り付け入力です。ユーザーは、どこかからコピーした電話番号や郵便番号を貼り付けることがよくあります。多くは全角で、ー(全角ダッシュ)やスペースといった整形文字が混じります。貼り付けでは変換イベントが発火しないため、変換ベースのロジックだけでは見逃してしまいます。changeやblurイベントでの正規化なら、打った値も貼り付けた値も拾えます。これも、変換処理だけでなく正規化こそが恒久的な直し方である理由です。タイミングは変換で、内容は正規化で扱います。

ビフォー(貼り付けた全角番号が弾かれる)
貼り付け: 123-4567 → エラー「数字のみ入力可」
全角の郵便番号を全角ダッシュ付きで貼り付けると弾かれます。ユーザーは有効な値をコピーしただけなのにブロックされます。
アフター(貼り付けも含めchangeで正規化)
123-4567 → 1234567(全角→半角・記号除去)→ OK
changeイベントで正規化すれば、貼り付けも手入力も同じように扱えます。ダッシュを除去し、幅を変換してから検証します。

エラーを防ぐ入力ヘルプ文

日本語フォームのエラーを減らす最も安上がりな方法は、入力した後で叱るのではなく、入力する前にそのフィールドが何を期待しているかを伝えることです。最も価値のあるヒントは、期待する文字幅とスクリプトを例とともに示すことです。電話番号フィールドなら「半角数字でご入力ください(例:09012345678)」が、期待する幅と形を伝えます。氏名フィールドなら、漢字・かな・ローマ字のどれを期待しているかを示せば、ユーザーが迷わずに済みます。

ただしヘルプ文は強制ではなく案内であるべきです。最良のフォームは、それでも全角入力を受け付けて静かに正規化します。ヘルプ文は期待値を伝え、驚きを減らすために使い、ブロックの口実にはしません。「半角数字で」と読んでもなお全角を打ってしまうユーザーは、IMEが既定でそうしてしまうからであり、エラーで罰するのではなく正規化で補正すべきです。エラーメッセージは、本当に必要なときには、フィールド名を挙げ、何が問題かを述べ、正しい例を、ですます調の丁寧な日本語で示す、具体的で思いやりのあるものにします。

ビフォー(曖昧で罰するようなエラー)
入力エラー
フィールド名も理由も例もありません。ユーザーはどのフィールドが誤りか、どう直せばよいか分かりません。
アフター(具体的で事前のヘルプ)
電話番号(ハイフンなし・半角数字) 例:09012345678
入力前にフィールドの下にヘルプ文として配置。幅・形式・例を示します。静かな正規化と組み合わせれば、ほとんどのユーザーはそもそもエラーを見ずに済みます。

日本語入力QAチェックリスト

🔢

文字幅とスクリプト

  • 全角は弾かず正規化する: 電話・郵便番号・カード・メールの各フィールドは、検証前に全角の数字と記号を半角へ変換する。090と@を打ってテスト。
  • 氏名・自由記述フィールドは混在幅を受け付ける: 日本人の氏名や文章を壊す一律半角変換をしない。氏名フィールドに「ASCIIのみ」「スペース不可」を課さない。
  • フィールドごとの幅ポリシーを定義する: 各フィールドが、保存内容に基づき半角へ正規化するか、そのまま受け付けるかを文書化する。
⌨

IME変換とタイミング

  • 検証はcompositionendを待つ: 変換中にキー入力単位の検証を発火させない。漢字の氏名をゆっくり打ち、変換中にエラーが出ないことを確認。
  • フリガナはIMEの読みから自動入力する: 確定した読みがカナフィールドを埋め、必要に応じてひらがなをカタカナへ変換する。
  • 貼り付け入力を正規化する: 正規化を変換だけでなくchange/blurで実行し、貼り付けた全角値や全角ダッシュを扱う。
💬

ヒント・ヘルプ文・エラー

  • ime-modeをinputmodeに置き換える: 非推奨のCSS ime-modeに依存しない。フィールドは標準のinputmode属性をヒントとして使う。
  • ヘルプ文は幅・形式・例を示す: ユーザーが打つ前に、ですます調の丁寧な日本語で期待値を示す。例:「半角数字(例:09012345678)」。
  • エラーは具体的で思いやりがある: 各エラーはフィールド名を挙げ、問題を述べ、正しい例を示す。素っ気ない「入力エラー」だけにしない。
  • ヘルプ文は案内し、正規化が担保する: フォームは全角入力をブロックせず受け付けて静かに補正する。
090を弾く日本語フォームは、データを守っているわけではありません。サインアップしようとしている実在のユーザーに、まさにその瞬間、「この製品はあなたのために作られていない」と伝えてしまったのです。問題は幅ではありませんでした。幅は半角しかありえないという思い込みこそが、問題だったのです。

あなたの日本語フォームは、実在するユーザーを静かに弾いていませんか?

全角の数字、変換中の検証エラー、ASCII限定の氏名ルール。日本のユーザーがサインアップや決済の途中で離脱する理由として、最も多いのがこれらです。日本語入力のQAレビューでは、IME・全角・貼り付けまで含め、日本のユーザーが実際に打つとおりにフォームをテストし、どのフィールドが気づかれないまま失敗しているのかを正確に特定します。

ミニ診断を依頼する

入力のビフォー/アフター 4例

例1:電話番号フィールド

ビフォー
09012345678 → エラー「半角で入力してください」
有効な全角番号がブロックされます。ユーザーは意識して全角を選んだわけではなく、IMEが生成しました。
アフター
090… → 09012345678(自動で半角化)→ OK
全角の数字を検証前に半角へ正規化します。エラーは表示されません。

例2:氏名フィールドのバリデーション

ビフォー
お名前: 開 宗弘 → エラー「スペース・全角は使用不可」
「スペース不可・ASCIIのみ」のルールが、姓名間にスペースと漢字を含むごく普通の日本人の氏名を弾きます。
アフター
お名前: 開 宗弘 → そのまま受付
氏名フィールドは漢字・かな・慣例的な姓名間スペースを受け付けます。幅やASCIIの制限はありません。

例3:変換中のバリデーション

ビフォー(keyupで検証)
入力中「ひら」→ 即エラー
「開」へ変換する前の未確定の読みに対して、バリデーションが発火します。
アフター(compositionendで検証)
「ひら」→「開」確定 → 検証 → OK
変換中はバリデーションを抑制し、変換が確定した後にのみ実行します。

例4:フリガナフィールド

ビフォー
フリガナ: (空欄・手入力必須・カナのみ)
ユーザーは読みを手で打ち直さねばならず、カナのみのルールはひらがな入力を弾くことがあります。
アフター
お名前「開」入力 → フリガナ「ヒラキ」自動入力
IMEの読みがフリガナフィールドをカタカナに変換して自動入力し、必要なら編集できます。

よくある質問

なぜフォームが有効な日本語の氏名や電話番号を弾くのですか?

最も多い原因は、全角と半角の扱いです。入力モードによってはIMEが既定で全角を出すため、日本のユーザーは数字や@記号を全角(090ではなく090、@ではなく@)で打つことがよくあります。ASCIIだけを想定したバリデーションはこれを無効として弾きますが、ユーザーはごく普通の電話番号やメールアドレスを入力しただけです。直し方は、全角入力を弾くのではなく正規化することです。検証の前に全角の数字とラテン文字を半角に変換し、090と090を同じ値として扱います。

なぜユーザーが日本語を入力し終える前にバリデーションが発火するのですか?

日本語の入力はIMEを通して行われ、変換という段階があります。ユーザーが読みを打ち、IMEが変換候補を表示し、確定して初めてテキストが入力されます。キー入力のたび(inputイベントやkeyupイベント)に検証するJavaScriptは、この変換中にも動いてしまいます。未確定の途中テキストを検証し、ユーザーがまだ変換している最中にエラーを出すことがよくあります。直し方は、compositionstartとcompositionendのイベントを監視し、変換中はバリデーションを止めて、ユーザーが変換を確定してから検証することです。

日本語入力の制御にCSSのime-modeプロパティを使うべきですか?

いいえ。CSSのime-modeプロパティは非推奨で、現在のブラウザ標準からは外れています。半角を強制したりIMEを無効にしたりする目的でこれに頼ると、ブラウザによって挙動が不安定になるため、今の実装に組み込むべきではありません。標準でサポートされているのは、input要素のinputmode属性です。これは、期待する入力の種類(numeric、emailなど)をブラウザやソフトウェアキーボードにヒントとして伝えます。半角が必須のフィールド(数字の郵便番号など)では、適切なinputmodeを設定したうえで、全角入力をコード側で正規化するのが正しいやり方です。非推奨のCSSプロパティでIMEを抑え込もうとすべきではありません。

氏名フィールドからのフリガナ自動入力は実際どう動くのですか?

日本語のフォームには、漢字の氏名フィールドの隣にフリガナ(読み)フィールドがあることが多く、よくできたフォームは、ユーザーがIMEに打ち込んだ読みからフリガナを自動入力します。ユーザーは漢字の氏名を入力するとき、まず読みを打ってから変換します。その読みは、IMEの変換イベントを通じてページ側で取得できます。確定した読みを取得してフリガナフィールドに書き込めば、ユーザーは氏名を二度打たずに済みます。ただし、これはフォームが変換イベントを正しく監視している場合にしか機能しません。扱いを誤ると変換中のバリデーションエラーを引き起こすのと、同じ仕組みだからです。

日本語フォームのエラーを最も減らす入力ヘルプ文は何ですか?

最も効果が大きいのは、期待する文字幅と文字種を、入力後のエラーではなく入力前に示すことです。電話番号フィールドなら、「半角数字でご入力ください(例:09012345678)」と書けば、半角数字で入力すべきことが伝わり、例も示せます。氏名フィールドなら、漢字・かな・ローマ字のどれを求めているかを示せば、ユーザーは迷いません。大事なのは、最良のフォームは全角・半角の両方を受け付けて裏で正規化し、ヘルプ文を強制ではなく案内として使っている点です。全角の数字を打ったユーザーはブロックされず、自動で補正されます。

日本語フォーム・入力QA

自社のフォームは、日本のユーザーが実際に打つとおりに動きますか?

全角の数字、変換中の検証エラー、ASCII限定の氏名ルール、非推奨のime-modeによる小細工。これらは、日本のユーザーがサインアップや決済を離脱する構造的な原因です。的を絞ったQAレビューでは、実際のIMEでフォームをテストし、どのフィールドが有効な入力を静かに弾いているかを特定します。