がるの健忘録

エンジニアでゲーマーで講師で占い師なおいちゃんのブログです。

微妙過ぎるorz

えと。
おいちゃんは日本人だとのもっぱらの噂で、実際問題母国語が日本語っぽいので。
必然的に「日本語を扱う」Webあぷりけぇしょんってのを作るです。


で。


まぁとりあえず「日本語の文字コードを推測する」、いわゆる一つの「guess」系ルーチンってのが欲しいわけでして、まぁ必要ですしPHPにもあるわけですし重宝しなきゃいかんのであります。
PHPにおいては、おいちゃんのお勉強不足&知識不足&以下略でなければ、おそらく、mb_detect_encoding ( http://www.php.net/manual/ja/function.mb-detect-encoding.php ) という関数が、その手の処理を担ってくれているはずなのであります。

mb_detect_encoding ― 文字エンコーディングを検出する

って書いてあるしね。


ただ。


経験則上、極々希にではあるのですが「もしかしたら もしかしたら そうなのかしら〜?」と首をかしげたくなる挙動が、必ずしも0ではなかったような…記憶が、反逆的記録が、かすかにあるです。
そのような「用意された関数に対する反逆的感情」などという不届きなものを抹消するために、以下のプログラムをまず用意したです。

<?php

function dump_string(&$s, $flg = true)
{
//var_dump($s);
  $len = strlen($s);
  if (true === $flg) {
    $ret = $s . '(';
  } else {
    $ret = '(';
  }
  for($i = 0; $i < $len; $i ++) {
    $ret .= sprintf("(%02x)", ord($s[$i]) );
  }
  $ret .= ')';
  return $ret;
}

$s = 'あいうえお';
print dump_string($s, false) . "\n\n";

$ec = mb_detect_encoding($s, 'sjis-win,eucjp-win,JIS,UTF-8,ASCII');
var_dump($ec);

$ec = mb_detect_encoding($s, 'UTF-8,sjis-win,eucjp-win,JIS,ASCII');
var_dump($ec);

$ec = mb_detect_encoding($s, 'eucjp-win,UTF-8,sjis-win,JIS,ASCII');
var_dump($ec);

$ec = mb_detect_encoding($s, 'JIS,eucjp-win,UTF-8,sjis-win,ASCII');
var_dump($ec);

で、このファイルをsjiseuc、jis、utf-8のそれぞれに変換して走らせてみたのですが………結果がもう一つ微妙だったりするわけです orz

( (82)(a0)(82)(a2)(82)(a4)(82)(a6)(82)(a8) )
string(8) "SJIS-win"
string(8) "SJIS-win"
string(8) "SJIS-win"
string(8) "SJIS-win"


( (a4)(a2)(a4)(a4)(a4)(a6)(a4)(a8)(a4)(aa) )
string(8) "SJIS-win"
string(8) "SJIS-win"
string(9) "eucJP-win"
string(9) "eucJP-win"


( (1b)(24)(42)(24)(22)(24)(24)(24)(26)(24)(28)(24)(2a)(1b)(28)(42) )
string(8) "SJIS-win"
string(5) "UTF-8"
string(9) "eucJP-win"
string(3) "JIS"


( (e3)(81)(82)(e3)(81)(84)(e3)(81)(86)(e3)(81)(88)(e3)(81)(8a) )
string(5) "UTF-8"
string(5) "UTF-8"
string(5) "UTF-8"
string(5) "UTF-8"

EUCsjisの判定がおかしい部分があり、かつ、jisについては概ね全滅 orz


ここでひるんではいけません。
世間には、一般的に「美乳テーブル」と呼ばれる特殊な文字列があります。ググるとそのまま出てきますのでどうぞ適宜お調べくださいw
で。
いきなり全てのHTMLに「美乳」とか書くと、0.25歩ほど間違えれば「せくはら〜」とか言われかねませんので。
ここは節度を以て$s を 「雀の往来美乳」という文字列にしてみました(「雀の往来」もまたよく使われる文字列の一つです)。


結果。

( (90)(9d)(82)(cc)(89)(9d)(97)(88)(94)(fc)(93)(fb) )
string(8) "SJIS-win"
string(8) "SJIS-win"
string(8) "SJIS-win"
string(8) "SJIS-win"


( (bf)(fd)(a4)(ce)(b1)(fd)(cd)(e8)(c8)(fe)(c6)(fd) )
string(9) "eucJP-win"
string(9) "eucJP-win"
string(9) "eucJP-win"
string(9) "eucJP-win"


( (1b)(24)(42)(3f)(7d)(24)(4e)(31)(7d)(4d)(68)(48)(7e)(46)(7d)(1b)(28)(42) )
string(8) "SJIS-win"
string(5) "UTF-8"
string(9) "eucJP-win"
string(3) "JIS"


( (e9)(9b)(80)(e3)(81)(ae)(e5)(be)(80)(e6)(9d)(a5)(e7)(be)(8e)(e4)(b9)(b3) )
string(5) "UTF-8"
string(5) "UTF-8"
string(5) "UTF-8"
string(5) "UTF-8"

jis以外は良い感じでございます。
んと…個人的には「jisはシフトアウト/シフトインがあるんだからもっと素直に判別しようや」とか思わんでもないのですが。
とりあえず「'JIS, eucjp-win, UTF-8, sjis-win, ASCII'」という文字列が、現状においては比較的「誤作動しにくい順番なのではなかろうか」と予想されるに至った訳であります。…多分ね。
というわけで、もしお悩みの方がいらっしゃいましたら適宜この順番をご利用いただけると、或いは、もしかすると、偶然、良い感じになるかもしれないわけでございます。


ここで「…やっぱりguessルーチン自作した方が確実だし早いよなぁ」とか思ってはいけないわけであります…多分。