レビューを依頼する
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まで、フィールドには未確定の途中テキストが入っています。ブラウザはこのライフサイクルをcompositionstartcompositionupdatecompositionendのイベントで公開しており、これらを無視するフォームのロジックは、ユーザーがまだ入力していないテキストを相手にしていることになります。

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

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

全角・半角の区別は、「このフォームは日本語ユーザーを嫌っている」という報告の最も多い原因です。全角文字は1つのCJK文字の見た目の幅を占め、半角は見慣れた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(自動正規化)→ 受付完了
全角の数字を検証前に半角へ変換します。ユーザーは、自分で意識的に選んだわけではない幅のせいでブロックされることがありません。

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

体験して最も苛立つ日本語フォームのバグは、まだ名前を打っている最中に出るエラーです。これは、フォームが inputkeyup のイベントで検証しているために起こります。これらはキー入力のたび——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でフォームをテストし、どのフィールドが有効な入力を静かに弾いているかを特定します。