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.