** 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 に揃えるのが基本ですよってのは理解しているんです。

Internetなんてできる前のむか~し昔、MS-DOSとかパソコン通信とかの頃のお話なんですが、
文字コードが統一されてなく、事実上の標準はSHIFT-JISという文字コードが業界標準でした。
市販ソフトも、フリーソフトもテキストファイル系統はSHIFT-JISコードで扱うのがデファクトスタンダードでした。
ですがSHIFT-JIS必須なんて話は大昔の話で化石な話しです!

既にWeb界隈ではテキストファイルを [UTF-8N (UTF-8でBOMなし) ]で保存するのが基本になっていますが、
昔ながらのWindowsソフト達は未だにSHIFT-JIS固定が多いのが実情だったりするわけです。
Unicode対応させる為だけに市販ソフトを高価な金払って更新するのは正直げんなりします。
そして文字コード変換できるテキストエディタで逐一都修正の度、相互変換するのも面倒なんです

そこで宅内Webサーバには受付用uploaderに、ファイル名.CSVが来たら、
 ⇒ 文字コードをUTF-8に変換してから保存ってのを加えるのがスマートなのでそのように仕込んでいます。
(90%以上の確率でローカル⇒サーバなので、そのほうが圧倒的にストレスがすくなくてすむ。)


■Unicodeの怪現象。カタカナの濁音/半濁音の例外処理を追加する。

★全角カタカナが合字処理されてしまう問題が発生した。
基本的にブラウザ上で入力する文字列に関してはMacOSでも勝手に合字処理はされないのですが、
macOSのfinderが 濁点を「合字するほうが正しい」という思想のもと設計されてしまっているため、
「ガ」とか「パ」とかが「か」+「゛」の合字して勝手に保存されてしまっている。
この合字カナファイル名がメールの添付ファイルやコピペなりでInternet上で拡散してしまうのが起因です。

モダンなブラウザならJavaScriptでonChangeイベントに「form.String.normalize()」で
都度変換するのがすごく楽だけど、IEとかAndroidのOS内蔵ブラウザはこれをスルーしてしまうし、
"神と神"とか"高と髙"とか。人名とかは変換されてしまうと失礼な場合があるんですよね・・
そうなってくると便利な関数を使わずローテク変換する手法しかない。

ぱぱっと作ったのは「半角カタカナを潰すついでで合字も一緒に変換」する関数です。
inputタグの onchange に呼び出すのを追加しておくと、たとえコピペで半角カタカナや合字が
コピペで入ったとしてもフォーム入力途中に変換されるので、サーバ上に届く前に駆除される。
onchangeで呼び出されるものにスピード要求したり、エレガントさを求めてもしょうがない。
ローテクで雑な変換だけど必要な動作をしてくれれば問題なし。

~・~ HTML内表記 ~・~

 <form name="xx">変換テスト:<inputstyle="width:400px" name="test"
 onchange="document.xx.test.value=toZenkaku(document.xx.test.value);"></form>

~・~ JavaScript表記 ~・~
 functiontoZenkaku(motoText){
  txt ="アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンァィゥェォャュョッ、。ー「」+&?";
  zen = "アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホ";
  zen+= "マミムメモヤユヨラリルレロワヲンァィゥェォャュョッ、。ー「」+&?";
  motoText = toHankaku(motoText);
  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 toHankaku(srcText){
  var han ="アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンァィゥェォャュョッ、。ー「」";
  han +="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ゙゚";
  var txt = "アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモ";
  txt+= "ヤユヨラリルレロワヲンァィゥェォャュョッ、。ー「」0123456789";
  txt+= "abcdefghijklmnopqrstuvwxyz";
  txt+= "ABCDEFGHIJKLMNOPQRSTUVWXYZ゛゜";
  var str = "";
  for (var i=0; i<srcText.length; i++){
    var c = srcText.charAt(i);
    var n = txt.indexOf(c,0);
    if (n >= 0) c = han.charAt(n);
    str += c;
  }
  return str;


変換テスト:
・・・ここにコピペして項目移動したり、余白クリックしたときに勝手に変換されます。