** 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/PC-98で普通に使われていたSHIFT-JISというのが業界標準だったんです。
ですがSHIFT-JIS必須なんて話は大昔の話ですでに化石な話しです!

既にWeb界隈では [UTF-8N(UTF-8でBOMなし)]で保存するのが暗黙の了解になっていますが、
昔ながらのOS標準のWindowsソフト達は未だにSHIFT-JIS依存が残るのが実情だったりするわけです。
そして文字コード変換できるテキストエディタで逐一都度相互変換するのも面倒この上ないし
Unicode対応させる為だけに市販ソフトに金払って更新するのは正直げんなりします。
(未だに某価格比較サイトからダウンロードできる商品データファイルは, SHIFT-JISなCSVファイルですし)

~~.CSVなテキストファイルを取り込みする部分にSHIFT-JIS ⇒ UTF-8Nに変換する行を入れる。
~~.CSVなテキストファイルを保存する部分にはUTF-8N ⇒ SHIFT-JISに変換する行を入れる。
(他人もデータを弄る可能性があるときはSHIFT-JIS準拠にしとくのが吉です。データ壊されたくないし。)

なので、
★ブラウザ上で処理できるものは処理する。
★perl上でオーバーヘッド少なく変換できるなら処理する。
・・・というのが基本的な対応となります。

HTMLファイルを変換するときにはひと手間追加が必要です。 文字コードとHTML表記を一致させる必要がある。
これに関してはSHIFT-JISな.htmlファイルをゴリゴリUTF-8に置換る場合perlで入出力したとき、
|use Encode;
~~~[中略]~~~
|foreach $line (@data) {
|  $line = decode('cp932', $line);
|  $line =~ s/charset=shift_jis/charset=UTF-8/g;
|  $line = encode('utf8', $line);
|}
これで @data にセットされているHTMLソースコードは "UTF-8で書かれた装丁" になる。
(charsetを置き換えてるのはファイルの文字コードとHTMLファイル内の文字コード宣言を一致させるため)

UTF-8N変換するだけじゃすまない問題を見つけたのでその対策もする


■Unicodeの怪現象。カタカナの濁音/半濁音の例外処理。

何故か濁音カタカナが合字処理されている箇所があるのはなぜだ。。・・これは面倒くさい・・
具体例:ファイル名検索で濁点ありが一致しなくなる

★全角カタカナが合字処理されてしまう問題。
 macOSのファイル管理システムが濁点を「合字するほうが正しい」という思想で設計されてしまっているため、
 ファイル名として入力されたカタカナが濁音カタカナではなく合字処理するのが正しいとされています。
 「ガ」とか「パ」とかが「か」+「゛」の合字としてファイル名処理されてしまっている・・・・
 この合字カナファイル名がメールの添付ファイルやコピペなりでInternet上で広がってしまう..

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

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

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