■ Unicode に揃えるのが基本ですよってのは理解しているんです。

Internetなんてできる前のむか~し昔、パソコン通信とかの頃。
数字でもって文字を表す文字コードが複数あって統一されてなく、
基本的にパソコンのシェア的にSHIFT-JISというのが基本だった。

まぁ、そんな話は既に昔の話ですよ!

既に文字コードは基本Unicodeにしましょうよ?の流れなので
Web界隈では [UTF-8N (UTF-8でBOMなし)]で保存するのが基本。
が、昔ながらのWindowsソフト達は未だにSHIFT-JIS固定が多く、
対応していたとしても、文字コードの処理する為だけにソフトを
高価な金払って更新するのはなんだよねぇと正直思ったり。
(文字コード変換できるテキストエディタで逐一変換するのも面倒)

なので、
・perl上でオーバーヘッド少なく変換できるならなんとかする。
・ブラウザ上でなんとかなるものはなんとかする。

■ Unicode の怪。カタカナの濁音/半濁音だけの処理。

全角カタカナが合字処理されてしまう問題。⇒ 主犯、macOS
「ガ」とか「パ」とかが「か」+「゛」の合字として処理される。
作ったファイル名がmacOS内だけで処理されるなら発覚しないが、
メールの添付ファイルやファイル名コピペなりで拡散するからね。

JavaScript内で前処理する場合、onChangeのタイミングで、
文字列自体を「form.String.normalize()」で都度変換するのが
楽チンだけど、旧字体とかの一部を丸めててしまう問題が発生する
"神と神"とか"高と髙"とか。人名とかは丸めると失礼な場合が・・
そうなると、便利な関数を使わずローテク変換する手法しかないんだよなぁ。
化石なIEとか、AndroidのOS内蔵ブラウザには実装されていないってのもある

手法としては「半角カタカナを潰すついでで合字を変換」です。
inputタグの onchange に呼び出すのを追加しておくと、
たとえコピペで半角カタカナや合字がコピペで入ったとしても、
入力途中に変換されるので、サーバ上に届く前に駆除される。
・・ローテクで雑な変換だけど、onchangeで呼び出されるものに
スピード要求したり、エレガントさを求めてもしょうがないのでw
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;
}

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

■ PerlでもUnicodeのファイル名が鬼門になるのよね

Webブラウザ上だけ変換にしてもこの問題は解決しない。
uploaderなどのファイル名引き継ぎでもこの問題は発生する。

ドキュメント内文章を丸ごと丸めると(必要以外な所が変換されて)
気が付かないという弊害が発生し、チェックコストがでかいので、
こちらも「ファイル名だけ丸めるくらい」がおすすめ。

#!/usr/bin/perl

use strict;
use utf8;
use Encode;
use Unicode::Normalize;

my $src = 'ポンジュース';
my $dst = Unicode::Normalize::NFKC($src);

print Encode::encode('utf8', "${src} => ${dst}\n");
# OUTPUT is: ポンジュース => ポンジュース


lastupdate Tue Jun 2 11:13:00 2020



アクセサリや同人誌,車関係は別の方です。このドメインは2005-08-11に取得し、そのままずーーーーっと使っております。

CCBot/2.0 (https://commoncrawl.org/faq/)

PAGE TOP