** 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ファイルですし)

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

~~.CSVなテキストファイルを取り込みする部分にSHIFT-JIS ⇒ UTF-8Nに変換する行を入れる。
~~.CSVなテキストファイルを吐き出しする部分にUTF-8N ⇒ SHIFT-JISに変換する行を入れる。

これに関しては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の怪現象。カタカナの濁音/半濁音の例外処理。

UTF-8N化されたテキストを見ていて発覚したのですが、何故か濁音カタカナが合字処理されている箇所がある・・

★全角カタカナが合字処理されてしまう問題。
 macOSのfinder が 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;
 }
  

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


この記事にはなんのコメントも付いておりません。