Posted By

daisuke103 on 03/28/08


Tagged

php textmate str utf-8 encord shft jis


Versions (?)

PHP 文字コード判定


 / Published in: PHP
 

  1. function detect_encoding_ja( $str )
  2. {
  3. $enc = @mb_detect_encoding( $str, 'ASCII,JIS,eucJP-win,SJIS-win,UTF-8' );
  4.  
  5. switch ( $enc ) {
  6. case FALSE :
  7. case 'ASCII' :
  8. case 'JIS' :
  9. case 'UTF-8' : break;
  10. case 'eucJP-win' :
  11. // ここで eucJP-win を検出した場合、eucJP-win として判定
  12. if ( @mb_detect_encoding( $str, 'SJIS-win,UTF-8,eucJP-win' ) === 'eucJP-win' ) {
  13. break;
  14. }
  15. $_hint = "¥xbf¥xfd" . $str; // "¥xbf¥xfd" : EUC-JP "雀"
  16.  
  17. // EUC-JP -> UTF-8 変換時にマッピングが変更される文字を削除( ≒ ≡ ∫ など)
  18. mb_regex_encoding( 'EUC-JP' );
  19. $_hint = mb_ereg_replace( "¥xad(?:¥xe2|¥xf5|¥xf6|¥xf7|¥xfa|¥xfb|¥xfc|¥xf0|¥xf1|¥xf2)"
  20.  
  21. $_tmp = mb_convert_encoding( $_hint, 'UTF-8', 'eucJP-win' );
  22. $_tmp2 = mb_convert_encoding( $_tmp, 'eucJP-win', 'UTF-8' );
  23. if ( $_tmp2 === $_hint ) {
  24.  
  25. // 例外処理( EUC-JP 以外と認識する範囲 )
  26. if (
  27. // SJIS と重なる範囲(2バイト|3バイト|iモード絵文字|1バイト文字)
  28. ! preg_match( '/^(?:'
  29. . '[¥x8E¥xE0-¥xE9][¥x80-¥xFC]|¥xEA[¥x80-¥xA4]|'
  30. . '¥x8F[¥xB0-¥xEF][¥xE0-¥xEF][¥x40-¥x7F]|'
  31. . '¥xF8[¥x9F-¥xFC]|¥xF9[¥x40-¥x49¥x50-¥x52¥x55-¥x57¥x5B-¥x5E¥x72-¥x7E¥x80
  32. . '[¥x00-¥x7E]'
  33. . ')+$/', $str ) &&
  34.  
  35. // UTF-8 と重なる範囲(全角英数字|漢字|1バイト文字)
  36. ! preg_match( '/^(?:'
  37. . '¥xEF¥xBC[¥xA1-¥xBA]|[¥x00-¥x7E]|'
  38. . '[¥xE4-¥xE9][¥x8E-¥x8F¥xA1-¥xBF][¥x8F¥xA0-¥xEF]|'
  39. . '[¥x00-¥x7E]'
  40. . ')+$/', $str )
  41. ) {
  42. // 条件式の範囲に入らなかった場合は、eucJP-win として検出
  43. break;
  44. }
  45. // 例外処理2(一部の頻度の多そうな熟語は eucJP-win として判定)
  46. // (珈琲|琥珀|瑪瑙|癇癪|碼碯|耄碌|膀胱|蒟蒻|薔薇|蜻蛉)
  47. if ( mb_ereg( '^(?:'
  48. . '¥xE0¥xDD¥xE0¥xEA|¥xE0¥xE8¥xE0¥xE1|¥xE0¥xF5¥xE0¥xEF|¥xE1¥xF2¥xE1¥xFB|'
  49. . '¥xE2¥xFB¥xE2¥xF5|¥xE6¥xCE¥xE2¥xF1|¥xE7¥xAF¥xE6¥xF9|¥xE8¥xE7¥xE8¥xEA|'
  50. . '¥xE9¥xAC¥xE9¥xAF|¥xE9¥xF1¥xE9¥xD9|[¥x00-¥x7E]'
  51. . ')+$', $str )
  52. ) {
  53. break;
  54. }
  55. }
  56.  
  57. default :
  58. // ここで SJIS-win と判断された場合は、文字コードは SJIS-win として判定
  59. $enc = @mb_detect_encoding( $str, 'UTF-8,SJIS-win' );
  60. if ( $enc === 'SJIS-win' ) {
  61. break;
  62. }
  63. // デフォルトとして SJIS-win を設定
  64. $enc = 'SJIS-win';
  65.  
  66. $_hint = "¥xe9¥x9b¥x80" . $str; // "¥xe9¥x9b¥x80" : UTF-8 "雀"
  67.  
  68. // 変換時にマッピングが変更される文字を調整
  69. mb_regex_encoding( 'UTF-8' );
  70. $_hint = mb_ereg_replace( "¥xe3¥x80¥x9c", "¥xef¥xbd¥x9e", $_hint );
  71. $_hint = mb_ereg_replace( "¥xe2¥x88¥x92", "¥xe3¥x83¥xbc", $_hint );
  72. $_hint = mb_ereg_replace( "¥xe2¥x80¥x96", "¥xe2¥x88¥xa5", $_hint );
  73.  
  74. $_tmp = mb_convert_encoding( $_hint, 'SJIS-win', 'UTF-8' );
  75. $_tmp2 = mb_convert_encoding( $_tmp, 'UTF-8', 'SJIS-win' );
  76.  
  77. if ( $_tmp2 === $_hint ) {
  78. $enc = 'UTF-8';
  79. }
  80. // UTF-8 と SJIS 2文字が重なる範囲への対処(SJIS を優先)
  81. if ( preg_match( '/^(?:[¥xE4-¥xE9][¥x80-¥xBF][¥x80-¥x9F][¥x00-¥x7F])+/', $str ) ) {
  82. $enc = 'SJIS-win';
  83. }
  84. }
  85. return $enc;
  86. }
  87.  

Report this snippet  

You need to login to post a comment.