質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

Internet Explorer

Internet Explorer(IE;MSIE)はマイクロソフトが開発したウェブブラウザです。Microsoft Windowsに組み込まれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

3回答

6530閲覧

javascriptで全角かな・カナを半角カナに変換するには

kumakumatan

総合スコア213

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

Internet Explorer

Internet Explorer(IE;MSIE)はマイクロソフトが開発したウェブブラウザです。Microsoft Windowsに組み込まれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2020/09/15 06:44

全角文字から半角文字に変換する関数として

javascript

1$("#id名").keydown(function () { 2 var str = $(this).val(); 3 str = str.replace(/[A-Za-z0-9-!”#$%&’()=<>,.?_[]{}@^~¥]/g, function (s) { 4 return String.fromCharCode(s.charCodeAt(0) - 65248); 5 }); 6 $(this).val(str); 7 }).change(); 8

と作成してみました。
これに追加する機能としてさらに、全角かな文字、全角カナ文字を「半角カナ」文字に変換するようにしたく思います。
どのようにしたらできますでしょうか?
どなたかご教授を宜しくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2020/09/15 06:49

IE対応?ソースがUTF8じゃないときどうするつもりでしょうか?
maisumakun

2020/09/15 06:50

> ソースがUTF8じゃないときどうするつもりでしょうか? JavaScriptの文字列は常にUTF-16です。
guest

回答3

0

どのようにしたらできますでしょうか?

かな文字1つ1つに対して、半角カナとの対応表を書く必要があるかと思います。特に、濁点・半濁点は半角カナでは1文字なので、全角のかな文字1文字に対して半角カナが2文字になることもあります。

なお、逆に「半角カナを全角カナにする」場合は、String.prototype.normalizeを使うことで可能です(Qiita)。

投稿2020/09/15 06:49

maisumakun

総合スコア146018

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

JavaScript

1class ZenToHan { 2 dictionary = { 3 "ガ":"ガ", 4 "ギ":"ギ", 5 "グ":"グ", 6 "ゲ":"ゲ", 7 "ゴ":"ゴ", 8 "ザ":"ザ", 9 "ジ":"ジ", 10 "ズ":"ズ", 11 "ゼ":"ゼ", 12 "ゾ":"ゾ", 13 "ダ":"ダ", 14 "ヂ":"ヂ", 15 "ヅ":"ヅ", 16 "デ":"デ", 17 "ド":"ド", 18 "バ":"バ", 19 "ビ":"ビ", 20 "ブ":"ブ", 21 "ベ":"ベ", 22 "ボ":"ボ", 23 "ヴ":"ヴ", 24 "ヷ":"ヷ", 25 "ヺ":"ヺ", 26 "パ":"パ", 27 "ピ":"ピ", 28 "プ":"プ", 29 "ペ":"ペ", 30 "ポ":"ポ", 31 "ガ":"ガ", 32 "ギ":"ギ", 33 "グ":"グ", 34 "ゲ":"ゲ", 35 "ゴ":"ゴ", 36 "ザ":"ザ", 37 "ジ":"ジ", 38 "ズ":"ズ", 39 "ゼ":"ゼ", 40 "ゾ":"ゾ", 41 "ダ":"ダ", 42 "ヂ":"ヂ", 43 "ヅ":"ヅ", 44 "デ":"デ", 45 "ド":"ド", 46 "バ":"バ", 47 "ビ":"ビ", 48 "ブ":"ブ", 49 "ベ":"ベ", 50 "ボ":"ボ", 51 "ヴ":"ヴ", 52 "ヷ":"ヷ", 53 "ヺ":"ヺ", 54 "パ":"パ", 55 "ピ":"ピ", 56 "プ":"プ", 57 "ペ":"ペ", 58 "ポ":"ポ", 59 "。":"。", 60 "「":"「", 61 "」":"」", 62 "、":"、", 63 "・":"・", 64 "ヲ":"ヲ", 65 "ァ":"ァ", 66 "ィ":"ィ", 67 "ゥ":"ゥ", 68 "ェ":"ェ", 69 "ォ":"ォ", 70 "ャ":"ャ", 71 "ュ":"ュ", 72 "ョ":"ョ", 73 "ッ":"ッ", 74 "ー":"ー", 75 "ア":"ア", 76 "イ":"イ", 77 "ウ":"ウ", 78 "エ":"エ", 79 "オ":"オ", 80 "カ":"カ", 81 "キ":"キ", 82 "ク":"ク", 83 "ケ":"ケ", 84 "コ":"コ", 85 "サ":"サ", 86 "シ":"シ", 87 "ス":"ス", 88 "セ":"セ", 89 "ソ":"ソ", 90 "タ":"タ", 91 "チ":"チ", 92 "ツ":"ツ", 93 "テ":"テ", 94 "ト":"ト", 95 "ナ":"ナ", 96 "ニ":"ニ", 97 "ヌ":"ヌ", 98 "ネ":"ネ", 99 "ノ":"ノ", 100 "ハ":"ハ", 101 "ヒ":"ヒ", 102 "フ":"フ", 103 "ヘ":"ヘ", 104 "ホ":"ホ", 105 "マ":"マ", 106 "ミ":"ミ", 107 "ム":"ム", 108 "メ":"メ", 109 "モ":"モ", 110 "ヤ":"ヤ", 111 "ユ":"ユ", 112 "ヨ":"ヨ", 113 "ラ":"ラ", 114 "リ":"リ", 115 "ル":"ル", 116 "レ":"レ", 117 "ロ":"ロ", 118 "ワ":"ワ", 119 "ン":"ン", 120 }; 121 122 convert = function (string) { 123 if (typeof string !== "string") { 124 throw `Argument "${string}" is invalid.`; 125 } 126 if (this.zenRegExp == null) { 127 this.zenRegExp = new RegExp(Object.keys(this.dictionary).join("|"), "g"); 128 } 129 return string.replace(this.zenRegExp, a => { 130 return this.dictionary[a]; 131 }); 132 }; 133} 134 135class HanToZen extends ZenToHan { 136 constructor() { 137 super(); 138 const entries = Object.entries(this.dictionary).filter(([key, value]) => !key.includes("\u{3099}")); 139 this.dictionary = {}; 140 for (const [key, value] of entries) { 141 this.dictionary[value] = key; 142 } 143 } 144}

次のように使います。

JavaScript

1const zenToHan = new ZenToHan(); 2zenToHan.convert("雨ニモ負ケズ風ニモ負ケズ雪ニモ夏ノ暑サニモ負ケズ");

濁音・半濁音が二回ずつ含まれているのは間違いではなく、二種類あるからです。
たとえば
「ガ」は U+30AB U+3099 ですが、「ガ」は U+30AC です。

またこれはすべてのカナに対応していません。たとえば「ヸ」は半角に含まれていないために対応できません。鼻濁音の「カ゚」やアイヌ語の「ト゚」も省いていますので、好みによって追加してください。根性があるなら、アルファベットなど他の文字も辞書に含めれば一度に変換できますが、次のように二回に分けて変換しても良いと思います。

JavaScript

1str = zenToHan.convert(str.replace(/[A-Za-z0-9-!”#$%&’()=<>,.?_[]{}@^~¥]/g, function (s) { 2 return String.fromCharCode(s.charCodeAt(0) - 65248); 3}));

hanToZen はその逆に半角カナを全角カナに直します。string.prototype.normalize と違って、半角カナのみを対象にします。

投稿2020/09/15 10:00

Zuishin

総合スコア28669

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

まず前提として、半角カナはASCII範囲の文字のように単純な文字コードの加減算では変換できませんので、変換表を作るのは避けられません。
変換表を使った変換方法はZuishinさんのコードがよいと思います。
ただ、String.prototype.normalizeを"NFD"で使えば1文字の(半)濁音を清音文字と(半)濁点にばらすまではできますので、変換表が単独の濁点半濁点と清音のみで済み少しすっきりします。
濁点と半濁点はU+3099「 ゙ 」とU+309A「 ゚ 」です。
また全角ひらがなから全角カタカナへの変換は、文字コードを+0x60で容易に可能です。

ところでお示しのコードは「”」「’」「¥」が正しく変換できません。

投稿2020/09/15 14:08

ikadzuchi

総合スコア3047

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問