** Caution!! For non-Japanese speaking people **
original page is written in Japanese only.
If you view this page via a translation site, you may not be able to accurately convey the nuances we intend.
■ Unicode に揃えるのが基本ですよってのは理解しているんです。
まぁ、すでにSHIFT-JISなんてそんな話は大昔の話ですよ!
既に基本Unicode の流れなので、Web界隈では [UTF-8N (UTF-8でBOMなし) ]で保存するのが基本。
ですが、昔ながらのWindowsソフト達は未だにSHIFT-JIS固定が多いのが実情で
文字コードの処理する為だけにソフトを高価な金払って更新するのはなんだよねぇと正直思ったり。
(文字コード変換できるテキストエディタで逐一変換するのも面倒)
なので、
・ブラウザ上で処理できるものは処理する。
・perl上でオーバーヘッド少なく変換できるなら処理する。
■ Unicodeの怪現象。カタカナの濁音/半濁音の例外処理。
⇒ 主犯、macOSのfinder が macOSのファイル管理システムが濁点を「合字するほうが正しい」
という思想のもと設計されてしまっているため、ファイル名として入力されたカタカナが
「ガ」とか「パ」とかが「か」+「゛」の合字して保存されてしまっている。
この合字カナファイル名がメールの添付ファイルやコピペなりでInternet上で拡散してしまう..
モダンなブラウザならJavaScript内でonChangeのタイミングで、「form.String.normalize()」で
都度変換するのがすごく楽だけど、IEとかAndroidのOS内蔵ブラウザはスルーしてしまうというし、
"神と神"とか"高と髙"とか。人名とかは変換されてしまうと失礼な場合があるんですよね・・
そうなると、便利な関数を使わずローテク変換する手法しかないんだよなぁ。
ぱぱっと作ったのは「半角カタカナを潰すついでで合字も一緒に変換」です。
inputタグの onchange に呼び出すのを追加しておくと、たとえコピペで半角カタカナや合字が
コピペで入ったとしても、フォームの入力途中に変換されるので、サーバ上に届く前に駆除される。
onchangeで呼び出されるものにスピード要求したり、エレガントさを求めてもしょうがないので w
ローテクで雑な変換だけど必要な動作をしてくれれば問題なし。
~・~ HTML内表記 ~・~
<form name="xx">変換テスト:<inputstyle="width:400px" name="test"
onchange="document.xx.test.value=toZenkaku(document.xx.test.value);"></form>
~・~ JavaScript表記 ~・~
function toZenkaku(motoText){
txt ="アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンァィゥェォャュョッ、。ー「」+&?";
zen = "アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホ";
zen+= "マミムメモヤユヨラリルレロワヲンァィゥェォャュョッ、。ー「」+&?";
str = "";
for (var i=0; i<motoText.length; i++){
var c = motoText.charAt(i);
var n = txt.indexOf(c,0);
if (n >= 0) c = zen.charAt(n);
str += c;
}
str = str.replace( /ガ/g, "ガ" ); str =str.replace( /ギ/g, "ギ" );
str = str.replace( /グ/g, "グ" ); str =str.replace( /ゲ/g, "ゲ" );
str = str.replace( /ゴ/g, "ゴ" );
str = str.replace( /ザ/g, "ザ" ); str =str.replace( /ジ/g, "ジ" );
str = str.replace( /ズ/g, "ズ" ); str =str.replace( /ゼ/g, "ゼ" );
str = str.replace( /ゾ/g, "ゾ" );
~~~ いか同じ感じで続くので省略 ~~~
return str;
}
function toZenkaku(motoText){
txt ="アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンァィゥェォャュョッ、。ー「」+&?";
zen = "アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホ";
zen+= "マミムメモヤユヨラリルレロワヲンァィゥェォャュョッ、。ー「」+&?";
str = "";
for (var i=0; i<motoText.length; i++){
var c = motoText.charAt(i);
var n = txt.indexOf(c,0);
if (n >= 0) c = zen.charAt(n);
str += c;
}
str = str.replace( /ガ/g, "ガ" ); str =str.replace( /ギ/g, "ギ" );
str = str.replace( /グ/g, "グ" ); str =str.replace( /ゲ/g, "ゲ" );
str = str.replace( /ゴ/g, "ゴ" );
str = str.replace( /ザ/g, "ザ" ); str =str.replace( /ジ/g, "ジ" );
str = str.replace( /ズ/g, "ズ" ); str =str.replace( /ゼ/g, "ゼ" );
str = str.replace( /ゾ/g, "ゾ" );
~~~ いか同じ感じで続くので省略 ~~~
return str;
}
・・・ここにコピペして項目移動したり、余白クリックしたときに勝手に変換されます。