全角文字から半角文字に変換する関数として
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ページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/15 06:50
回答3件
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
総合スコア28669
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
まず前提として、半角カナはASCII範囲の文字のように単純な文字コードの加減算では変換できませんので、変換表を作るのは避けられません。
変換表を使った変換方法はZuishinさんのコードがよいと思います。
ただ、String.prototype.normalize
を"NFD"で使えば1文字の(半)濁音を清音文字と(半)濁点にばらすまではできますので、変換表が単独の濁点半濁点と清音のみで済み少しすっきりします。
濁点と半濁点はU+3099「 ゙ 」とU+309A「 ゚ 」です。
また全角ひらがなから全角カタカナへの変換は、文字コードを+0x60で容易に可能です。
ところでお示しのコードは「”」「’」「¥」が正しく変換できません。
投稿2020/09/15 14:08
総合スコア3047
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。