Encdet.rb

e$BA0$+$i9M$($F$$$?$N$G$9$,!"%U%!%$%[email protected],$Ne(B magic comment e$B$de(B
BOM e$B$rD4$Y$Fe(B encoding [email protected]_Dj$7$F$/$l$k%i%$%V%i%j$rE:IU$9$k$Ne(B
e$B$O$I$&$G$7$g$&$+!#e(B

% head -1 lib/rexml/rexml.rb

-- encoding: utf-8 --

% ./ruby -Ilib -rencdet -e ’
EncDet.open(“lib/rexml/rexml.rb”) {|f|
p f.external_encoding
}’
#Encoding:UTF-8

e$B$H$$$&$h$&$K8!=P$G$-$^$9!#e(B

e$B$H$j$"$($:!"e(Blib/rdoc/rdoc.rb e$B$GE,Ev$K$d$C$F$$$k$N$r$3$&$$$&e(B
e$B$N$KJQ$($?$$$s$G$9$,!#e(B

Index: lib/encdet.rb

— lib/encdet.rb (revision 0)
+++ lib/encdet.rb (revision 0)
@@ -0,0 +1,96 @@
+module EncDet

  • def EncDet.open(fname, mode=‘r’)
  • if block_given?
  •  File.open(fname, mode) {|f|
    
  •    f.set_encoding detect_encoding(f)
    
  •    yield f
    
  •  }
    
  • else
  •  f = File.open(fname, mode)
    
  •  f.set_encoding detect_encoding(f)
    
  •  f
    
  • end
  • end
  • PEEKSIZE = 4096
  • Detectors = {}
  • Detectors[:magic_comment] = lambda {|buf|
  • if /\A#!/ =~ buf
  •  numlines = 2
    
  • else
  •  numlines = 1
    
  • end
  • target = ‘’
  • buf.each_line {|line|
  •  target << line
    
  •  numlines -= 1
    
  •  break if numlines == 0
    
  • }
  • if /coding[:=][ \t]*(?[\w.-]+)[^\w.-]/ =~ target
  •  begin
    
  •    Encoding.find(encname)
    
  •  rescue ArgumentError
    
  •    Encoding::ASCII_8BIT
    
  •  end
    
  • else
  •  if numlines == 0 && /\n\z/ =~ target
    
  •    :not_found
    
  •  else
    
  •    :more_bytes
    
  •  end
    
  • end
  • }
  • Detectors[:utf_bom] = lambda {|buf|
  • h = {
  •  "UTF-8" => /\A\xEF(?:\xBB(\xBF)?)?/n,
    
  •  "UTF-16BE" => /\A\xFE(\xFF)?/n,
    
  •  "UTF-16LE" => /\A\xFF(\xFE)?/n,
    
  • }
  • result = :not_found
  • h.each {|name, pat|
  •  if pat =~ buf
    
  •    if $1
    
  •      result = Encoding.find(name)
    
  •      break
    
  •    end
    
  •    result = :more_bytes
    
  •  end
    
  • }
  • result
  • }
  • def EncDet.detect_encoding(f)
  • result = nil
  • detectors = Detectors.dup
  • buf = ‘’
  • while buf.bytesize < PEEKSIZE
  •  begin
    
  •    buf << f.readpartial(PEEKSIZE - buf.bytesize)
    
  •  rescue EOFError
    
  •    break
    
  •  end
    
  •  next_detectors = {}
    
  •  detectors.each {|name, det|
    
  •    r = det.call(buf)
    
  •    case r
    
  •    when :not_found
    
  •      next
    
  •    when :more_bytes
    
  •      next_detectors[name] = det
    
  •    when Encoding
    
  •      result = r
    
  •      break
    
  •    else
    
  •      raise TypeError, "unexpected detection result by #{name}: 
    

#{r.inspect}"

  •    end
    
  •  }
    
  •  break if next_detectors.empty? || result
    
  •  detectors = next_detectors
    
  • end
  • f.ungetc buf
  • result || f.external_encoding
  • end
    +end
    Index: test/test-encdet.rb
    ===================================================================
    — test/test-encdet.rb (revision 0)
    +++ test/test-encdet.rb (revision 0)
    @@ -0,0 +1,41 @@
    +require ‘test/unit’
    +require ‘encdet’

+class TestEncDet < Test::Unit::TestCase
+

  • def check_detect_encoding(content, enc)
  • r, w = IO.pipe
  • w.write content
  • w.close
  • result = EncDet.detect_encoding®
  • assert_equal(Encoding.find(enc), result)
  • ensure
  • r.close if r && !r.closed?
  • w.close if w && !w.closed?
  • end
  • def test_magic_comment
  • [
  •  ["-*- coding: utf-8 -*-\n\u{3042}\n", "UTF-8"],
    
  •  ["-*- coding: euc-jp -*-\n\xa4\xa2\n", "EUC-JP"],
    
  •  ["#!/bin/sh\n# -*- coding: utf-8 -*-\n\u{3042}\n", "UTF-8"],
    
  •  ["#!/bin/sh\n# -*- coding: euc-jp -*-\n\xa4\xa2\n", "EUC-JP"],
    
  •  ["\n-*- coding: utf-8 -*-\n\u{3042}\n", Encoding.locale_charmap],
    
  •  ["\n-*- coding: euc-jp -*-\n\xa4\xa2\n", 
    

Encoding.locale_charmap],

  • ].each {|content, enc|
  •  check_detect_encoding(content, enc)
    
  • }
  • end
  • def test_bom
  • [
  •  ["\xef\xbb\xbfab", "UTF-8"],
    
  •  ["\xfe\xff\0a\0b", "UTF-16BE"],
    
  •  ["\xff\xfea\0b\0", "UTF-16LE"],
    
  • ].each {|content, enc|
  •  check_detect_encoding(content, enc)
    
  • }
  • end

+end
+

e$B$^$D$b$He(B e$B$f$-$R$m$G$9e(B

In message “Re: [ruby-dev:33628] encdet.rb”
on Thu, 7 Feb 2008 15:09:11 +0900, Tanaka A. [email protected]
writes:

|e$BA0$+$i9M$($F$$$?$N$G$9$,!"%U%!%$%[email protected],$Ne(B magic comment e$B$de(B
|BOM e$B$rD4$Y$Fe(B encoding [email protected]_Dj$7$F$/$l$k%i%$%V%i%j$rE:IU$9$k$Ne(B
|e$B$O$I$&$G$7$g$&$+!#e(B

e$BE:IU$9$k$3$H$K$O;[email protected]$7$^$9!#e(Bencdete$B$H$$$&L>A0$O%T%s$HMh$^$;$se(B
e$B$,!"@dBPH?BP$H$$$&$[$I$G$O$"$j$^$;$s!#[email protected]!"e(Bdete$B$h$j$Oe(Bdetect
[email protected]<($7$?J}$,9%$_$G$9$,!#e(B

At 15:55 08/02/07, Yukihiro M. wrote:

e$B$,!"@dBPH?BP$H$$$&$[$I$G$O$"$j$^$;$s!#[email protected]!"e(Bdete$B$h$j$Oe(Bdetect
[email protected]<($7$?J}$,9%$_$G$9$,!#e(B

e$BL>A0$H$7$F$Oe(B EncodingDetection e$B$H$+e(B DetectEncoding
e$B$,$$$$$H;W$$$^$9!#e(B
e$B$7$+$7e(B Ruby e$B$N>l9g!"e(Bencoding
e$B$O7k9=J8;z%3!<%I$H$N$D$J$,$j$,6/$$$N$G!"e(B
magic comment
e$B$J$I$b07$&$3$H$r$b$&$A$g$C$HJ,$+$j$d$9$/$9$k$N$,$$$$$N$G$Oe(B
e$B$H$b;W$$$^$9!#e(B

e$B59$7$/$*4j$$$7$^$9!#e(B Martin.

#-#-# Martin J. Du"rst, Assoc. Professor, Aoyama Gakuin University
#-#-# http://www.sw.it.aoyama.ac.jp mailto:[email protected]

e$B?\F#$G$9!#e(B

In [email protected]
“[ruby-dev:33628] encdet.rb” on Thu, 7 Feb 2008 15:09:11 +0900,
Tanaka A. [email protected] wrote:

#Encoding:UTF-8

e$B$H$$$&$h$&$K8!=P$G$-$^$9!#e(B

EncDete$B$H$$$&$h$&$KL>A0$rC;$/$7$F;H$$$d$9$/!JFI$_$E$i$/!K$9$ke(B
e$B$/$i$$$h$/;H$&$h$&$J%i%$%V%i%j$H$O;W$($J$$$N$G!"e(B
Encoding::Detectore$B$/$i$$$NJ}$,$h$$5$$,$7$^$9!#e(B

e$B$^$?!"e(BEncDet.detect_encodinge$B$OF1$8$h$&$JC18l$,e(B2e$B2s$:$D8=$l$F$$e(B
e$B$F!"e(BEncDete$B$H$7$F$$$k$o$j$KL>A0$,>iD9$J$N$,JQ$J46$8$,$7$^$9!#e(B
Encoding::Detector.detecte$B$/$i$$$G$O$I$&$G$7$g$&$+!#e(B

e$B$D$$$G$K!"e(BEncDet.opene$B$h$j$be(BIO#opene$B$Ne(Bmodee$B$Ge(B"r:detect"e$B$H;XDj$Ge(B
e$B$-$?J}$,;H$$$d$9$$5$$,$7$^$9!#e(B

e$B?\F#$G$9!#e(B

In [email protected]
“[ruby-dev:33642] Re: encdet.rb” on Thu, 7 Feb 2008 22:45:50 +0900,
Yukihiro M. [email protected] wrote:

|e$B$D$$$G$K!"e(BEncDet.opene$B$h$j$be(BIO#opene$B$Ne(Bmodee$B$Ge(B"r:detect"e$B$H;XDj$Ge(B
|e$B$-$?J}$,;H$$$d$9$$5$$,$7$^$9!#e(B

e$B$=$&$$$&5!G=$b$[$7$$$H$O;W$$$^$9$,!“e(BIO#opene$B$Ne(Bmodee$B$Ge(Bdetecte$B$re(B
e$B;XDj$7$?>l9g$K$O$b$C$H%R%e!<%j%9%F%#%C%/$K%(%s%3!<%G%#%s%0$re(B
e$B?dB,$9$k$3$H$,5a$a$i$l$k$H;W$$$^$9$7!”%^%8%C%/%3%a%s%H$r2r<ae(B
e$B$9$k$N$b$J$s$+JQ$J5$$,$7$^$9!#e(B

e$B%R%e!<%j%9%F%#%C%/$K$d$k$N$G$"$l$Pe(Bguesse$B$NJ}$,$h$$5$$,$7$^$9!#e(B
e$B1Q8l$O$h$/$o$+$i$J$$$N$G$+$J$jE,Ev$J$N$G$9$,!"e(Bdetecte$B$O%R%e!<e(B
e$B%j%9%F%#%C%/$H$$$&$h$j$b$C$H$*7x$$%$%a!<%8$,$7$^$9!#e(B

e$BFC$K$I$&$7$F$be(Bdetecte$B$,$h$$$H$$$&$o$1$G$O$J$$$N$G$9$,!"$H$K$+e(B
e$B$/e(BEncDet.opene$B$G$O$J$$J}$,4r$7$$$G$9!#e(B

e$B$^$D$b$He(B e$B$f$-$R$m$G$9e(B

In message “Re: [ruby-dev:33641] Re: encdet.rb”
on Thu, 7 Feb 2008 21:03:56 +0900, Kouhei S. [email protected]
writes:

|e$B$D$$$G$K!"e(BEncDet.opene$B$h$j$be(BIO#opene$B$Ne(Bmodee$B$Ge(B"r:detect"e$B$H;XDj$Ge(B
|e$B$-$?J}$,;H$$$d$9$$5$$,$7$^$9!#e(B

e$B$=$&$$$&5!G=$b$[$7$$$H$O;W$$$^$9$,!“e(BIO#opene$B$Ne(Bmodee$B$Ge(Bdetecte$B$re(B
e$B;XDj$7$?>l9g$K$O$b$C$H%R%e!<%j%9%F%#%C%/$K%(%s%3!<%G%#%s%0$re(B
e$B?dB,$9$k$3$H$,5a$a$i$l$k$H;W$$$^$9$7!”%^%8%C%/%3%a%s%H$r2r<ae(B
e$B$9$k$N$b$J$s$+JQ$J5$$,$7$^$9!#e(B

In article [email protected],
Yukihiro M. [email protected] writes:

e$BE:IU$9$k$3$H$K$O;[email protected]$7$^$9!#e(Bencdete$B$H$$$&L>A0$O%T%s$HMh$^$;$se(B
e$B$,!"@dBPH?BP$H$$$&$[$I$G$O$"$j$^$;$s!#[email protected]!"e(Bdete$B$h$j$Oe(Bdetect
[email protected]<($7$?J}$,9%$_$G$9$,!#e(B

e$BL>A0$K$D$$$F$O$H$/[email protected]$o$C$F$$$J$$$N$G!"JQ$($k$N$O9=$$$^$;$s!#e(B

e$B:#$^$G$K=P$F$$$k$N$O0J2<$N$b$N$/$i$$$G$7$g$&$+!#e(B

encdet.rb
encdetect.rb

EncDet
EncDetect
EncodingDetection
DetectEncoding
Encoding::Detector

e$B$I$l$,$$$$$+$J$!!#e(B

e$B?\F#$G$9!#e(B

In [email protected]
“[ruby-dev:33780] Re: encdet.rb” on Thu, 14 Feb 2008 17:55:07 +0900,
Tanaka A. [email protected] wrote:

EncDet
EncDetect
EncodingDetection
DetectEncoding
Encoding::Detector

e$B$I$l$,$$$$$+$J$!!#e(B

e$B$b$7e(BEncoding::Detectore$B$K$J$k$J$ie(Bencoding/detector.rbe$B$,$$$$$Ge(B
e$B$9!#e(B

e$B$H$3$m$G!"JQ$($k$N$O%U%!%$%kL>$H%b%8%e!<%kL>[email protected]$1$G$9$+!)e(B
e$B%a%=%C%IL>$dDj?tL>$bJQ$($F$[$7$$$G$9!#!Je(BDetectors ->
DETECTORSe$B!Ke(B

In article [email protected],
Kouhei S. [email protected] writes:

e$B$b$7e(BEncoding::Detectore$B$K$J$k$J$ie(Bencoding/detector.rbe$B$,$$$$$Ge(B
e$B$9!#e(B

e$B%G%#%l%/%H%j$rJ,$1$k$N$C$F!"$"$s$^$j$$$$0u>]$,$J$$$s$G$9$,!#e(B
test/ e$B$H$+e(B io/ e$B$H$+!"%G%#%l%/%H%j$O$"$k$1$l$ICf$K$O7k6I$R$He(B
e$B$D$7$+$J$$$7!#e(B

e$B:#2sDs0F$7$F$$$k$b$N0J30$K!"$J$K$+6qBNE*$Ke(B encoding/ e$B0J2<$Ke(B
e$BF~$l$?$$$b$N$,$"$j$^$9$+e(B?

e$B$H$3$m$G!"JQ$($k$N$O%U%!%$%kL>$H%b%8%e!<%kL>[email protected]$1$G$9$+!)e(B
e$B%a%=%C%IL>$dDj?tL>$bJQ$($F$[$7$$$G$9!#!Je(BDetectors -> DETECTORSe$B!Ke(B

e$B$"$!!"e(BDETECTORS e$B$KJQ$($k$N$O$H$F$bE,@Z$G$9$M!#$3$l$O$=$&$7$^e(B
e$B$7$g$&!#e(B

e$B%a%=%C%IL>$K$D$$$F$O!“e(Bopen e$B$OJQ$($J$/[email protected]$m$&$H;W$C$F$$e(B
e$B$^$9!#e(Bdetect_encoding
e$B$K$O$=$l$[[email protected]$o$j$O$”$j$^$;$s$,!"%U%!e(B
e$B%$%kL>$d%b%8%e!<%kL>$,@h$+$J$!!#e(B

e$B?\F#$G$9!#e(B

In [email protected]
“[ruby-dev:33783] Re: encdet.rb” on Thu, 14 Feb 2008 23:52:05 +0900,
Tanaka A. [email protected] wrote:

e$B$b$7e(BEncoding::Detectore$B$K$J$k$J$ie(Bencoding/detector.rbe$B$,$$$$$Ge(B
e$B$9!#e(B

e$B%G%#%l%/%H%j$rJ,$1$k$N$C$F!"$"$s$^$j$$$$0u>]$,$J$$$s$G$9$,!#e(B
test/ e$B$H$+e(B io/ e$B$H$+!"%G%#%l%/%H%j$O$"$k$1$l$ICf$K$O7k6I$R$He(B
e$B$D$7$+$J$$$7!#e(B

e$B$R$H$D$7$+$J$$$3$H$G$J$K$+LdBj$,$"$C$?7P83$,$"$k$H$$$&$3$H$Ge(B
e$B$7$g$&$+!)e(B

e$B8D?ME*$K$O!“e(Bencdete$B$N$h$&$J$h$/;H$o$l$F$$$k$o$1$G$O$J$$>JN,L>e(B
e$B$r;H$C$?L>A0$K$O$”$s$^$j$$$$0u>]$O$"$j$^$;$s!#!J%Q%C$H8+$F$Je(B
e$B$K$r0UL#$7$F$$$k$N$+J,$+$i$J$$!#!Ke(B

e$B0u>]$H$O4X78$"$j$^$;$s$,!"e(BRubye$B$G$OL>A06u4V$r%G%#%l%/%H%j9=B$e(B
e$B$KH?1G$7$F$$$k$3$H$O$o$j$HIaDL$J$3$H$N$h$&$K;W$$$^$9!#e(B
URIe$B$de(BWEBricke$B$J$I$b$=$&$J$C$F$$$k5$$,$7$^$9!#e(B

e$B:#2sDs0F$7$F$$$k$b$N0J30$K!"$J$K$+6qBNE*$Ke(B encoding/ e$B0J2<$Ke(B
e$BF~$l$?$$$b$N$,$"$j$^$9$+e(B?

e$B;d$OFC$K$"$j$^$;$s!#e(B
e$BB>$KF~$l$k$b$N$,$"$k$N$J$i%G%#%l%/%H%j$r7!$k$N$O5$$K$J$i$J$$e(B
e$B$H$$$&$3$H$G$7$g$&$+!)e(B
[email protected]$$J}$rJQ$($k$H!“e(Bencoding/e$B0J2<$KF~$k$b$N$,$3$l0J>eA}$($k2DG=e(B
[email protected]$,e(B0e$B$G$”$l$P!"e(Bencoding/e$B$O:n$j$?$/$J$$$H$$$&$3$H$G$7$g$&$+!)e(B

e$B$H$3$m$G!"JQ$($k$N$O%U%!%$%kL>$H%b%8%e!<%kL>[email protected]$1$G$9$+!)e(B
e$B%a%=%C%IL>$dDj?tL>$bJQ$($F$[$7$$$G$9!#!Je(BDetectors -> DETECTORSe$B!Ke(B

e$B$"$!!"e(BDETECTORS e$B$KJQ$($k$N$O$H$F$bE,@Z$G$9$M!#$3$l$O$=$&$7$^e(B
e$B$7$g$&!#e(B

e$B$"$j$,$H$&$4$6$$$^$9!#e(B

[email protected]$G$9!#e(B

At Thu, 14 Feb 2008 23:52:05 +0900,
Tanaka A. wrote in [ruby-dev:33783]:

e$B%G%#%l%/%H%j$rJ,$1$k$N$C$F!"$"$s$^$j$$$$0u>]$,$J$$$s$G$9$,!#e(B
test/ e$B$H$+e(B io/ e$B$H$+!"%G%#%l%/%H%j$O$"$k$1$l$ICf$K$O7k6I$R$He(B
e$B$D$7$+$J$$$7!#e(B

ioe$B$K$Oe(Bconsolee$B$H$$$&$N$rF~$l$h$&$+$H;W$C$F$?$s$G$9$,!"$9$C$+$jK:e(B
e$B$l$F$^$7$?!#e(B

In article [email protected],
Kouhei S. [email protected] writes:

e$B$R$H$D$7$+$J$$$3$H$G$J$K$+LdBj$,$"$C$?7P83$,$"$k$H$$$&$3$H$Ge(B
e$B$7$g$&$+!)e(B

e$B$=$N$h$&$J%G%#%l%/%H%j$O3P$($K$/$$$H46$8$F$$$^$9!#e(B

e$B$*$=$i$/!"3,AX9=B$$K$9$k$3$H$OJ,N$N0UL#$,$"$k$N$K!"$R$H$D$7e(B e$B$+$J$$$N$G$OJ,N$N0UL#$,$J$$$3$H$,860x$G$O$J$$$+$H;W$C$F$$$^e(B
e$B$9!#0lHL$K0UL#$N$J$$$3$H$r3P$($k$N$OFq$7$$$b$N$G$9$7!#e(B

e$B8D?ME*$K$O!“e(Bencdete$B$N$h$&$J$h$/;H$o$l$F$$$k$o$1$G$O$J$$>JN,L>e(B
e$B$r;H$C$?L>A0$K$O$”$s$^$j$$$$0u>]$O$"$j$^$;$s!#!J%Q%C$H8+$F$Je(B
e$B$K$r0UL#$7$F$$$k$N$+J,$+$i$J$$!#!Ke(B

e$B$O$$!#$I$N$/$i$$>JN,$7!"$I$N$/$i$$>JN,[email protected]$NM>CO$,e(B
e$B$"$j$^$9!#e(B

e$B$$$^$N$H$3$m!"e(Bencdet e$B$h$j$OD9$/$7$h$&$+$H$$$&5$$K$J$C$F$$$^e(B
e$B$9!#e(B

[email protected]!"%G!<%?<+?H$K%(%s%3!<%G%#%s%0$r5-O?$9$k$H$$$&$N$O!"$=$le(B
e$B$J$j$KIa5Z$7$F$[$7$$$H;W$C$F$$$k$N$G!";H$$$K$/$$$[$ID9$/$7$?e(B
e$B$$$H$O;W$$$^$;$s!#$=$N0UL#$Ge(B Encoding::Detector.open
e$B$O$A$g$Ce(B
e$B$HD9$9$.$k$h$&$K;W$$$^$9!#e(B

e$BHf3SBP>]$N%m%1!<%k0MB8$J$b$N$Oe(B open e$B$Ne(B
4e$BJ8;z$J$N$G$3$l$HF1Eye(B
e$B$ND9$5$rK>$`$N$OL5M}[email protected]$H;W$$$^$9$,!"$"$^$j:9$,3+$-$9$.$k$N$Oe(B
e$B$h$m$7$/$J$$$H46$8$F$$$^$9!#e(B

e$B0u>]$H$O4X78$"$j$^$;$s$,!"e(BRubye$B$G$OL>A06u4V$r%G%#%l%/%H%j9=B$e(B
e$B$KH?1G$7$F$$$k$3$H$O$o$j$HIaDL$J$3$H$N$h$&$K;W$$$^$9!#e(B
URIe$B$de(BWEBricke$B$J$I$b$=$&$J$C$F$$$k5$$,$7$^$9!#e(B

e$B$=$&$G$9$M!#e(BURI e$B$de(B WEBrick e$B$h$j$Oe(B Net
e$B$N$[$&$,Nc$H$7$F$OE,@Ze(B
[email protected]$H;W$$$^$9$,!"$=$N47=,$O$?$7$+$K$"$k$H;W$$$^$9!#$=$&$$$&47e(B
e$B=,$,3P$($d$9$5$NMW0x$K$J$k$N$O$?$7$+$G$9!#e(B

e$B:#2sDs0F$7$F$$$k$b$N0J30$K!"$J$K$+6qBNE*$Ke(B encoding/ e$B0J2<$Ke(B
e$BF~$l$?$$$b$N$,$"$j$^$9$+e(B?

e$B;d$OFC$K$"$j$^$;$s!#e(B
e$BB>$KF~$l$k$b$N$,$"$k$N$J$i%G%#%l%/%H%j$r7!$k$N$O5$$K$J$i$J$$e(B
e$B$H$$$&$3$H$G$7$g$&$+!)e(B
[email protected]$$J}$rJQ$($k$H!“e(Bencoding/e$B0J2<$KF~$k$b$N$,$3$l0J>eA}$($k2DG=e(B
[email protected]$,e(B0e$B$G$”$l$P!"e(Bencoding/e$B$O:n$j$?$/$J$$$H$$$&$3$H$G$7$g$&$+!)e(B

e$B:G=i$K=R$Y$?$h$&$K3P$($K$/$$$H;W$C$F$$$^$9$N$G!"5$$,?J$_$^$;e(B
e$B$s!#e(B

e$B$=$s$J$o$1$G!“e(Bencdetect e$B$+$J$!!”$H;W$C$F$$$^$9!#e(B

e$B?\F#$G$9!#e(B

In [email protected]
“[ruby-dev:33856] Re: encdet.rb” on Tue, 19 Feb 2008 14:32:15 +0900,
Tanaka A. [email protected] wrote:

e$B$R$H$D$7$+$J$$$3$H$G$J$K$+LdBj$,$"$C$?7P83$,$"$k$H$$$&$3$H$Ge(B
e$B$7$g$&$+!)e(B

e$B$=$N$h$&$J%G%#%l%/%H%j$O3P$($K$/$$$H46$8$F$$$^$9!#e(B

e$B$*$=$i$/!"3,AX9=B$$K$9$k$3$H$OJ,N$N0UL#$,$"$k$N$K!"$R$H$D$7e(B e$B$+$J$$$N$G$OJ,N$N0UL#$,$J$$$3$H$,860x$G$O$J$$$+$H;W$C$F$$$^e(B
e$B$9!#0lHL$K0UL#$N$J$$$3$H$r3P$($k$N$OFq$7$$$b$N$G$9$7!#e(B

e$B%G%#%l%/%H%j$r3P$($k$H$$$&>u67$,$h$/$o$+$i$J$$$N$G$9$,!"$I$&e(B
e$B$$$&$H$-$K%G%#%l%/%H%j$r3P$($k$N$G$7$g$&$+!)Nc$($P!“e(B
net/http.rbe$B$r;H$&$H$-$Oe(Bnete$B%G%#%l%/%H%j$r3P$($k!”$H$$$&$3$H$Ge(B
e$B$7$g$&$+!)e(B

e$B;d$O3,AX9=B$!Je(BXXX/YYYe$B!K$K$J$C$F$$$k;~$Oe(BXXXe$B$r3P$($h$&$H$O!J$?e(B
e$B$V$s!K;W$C$F$$$^$;$s$,!“e(BXXXe$B$K4XO”$9$ke(BYYYe$B$H$$$&5!G=$r;H$&!"$He(B
e$B9M$($F$$$k5$$,$7$^$9!#e(B

e$B$^$?!“e(BXXX/e$B0J2<$K%U%!%$%k$,2?8D$”$k$+$r0U<1$7$?$3$H$,$J$$$N$Ge(B
e$B$9$,!"$=$l$r0U<1$9$k$N$O$o$j$HIaDL$N$3$H$J$N$G$7$g$&$+!)e(B
e$B!Je(Bnet/e$B%7%j!<%:$O$$$m$$$m$"$k$J$!$H$+$O;W$C$?$3$H$,$"$k$H;W$$e(B
e$B$^$9!#!Ke(B

[email protected]!"%G!<%?<+?H$K%(%s%3!<%G%#%s%0$r5-O?$9$k$H$$$&$N$O!"$=$le(B
e$B$J$j$KIa5Z$7$F$[$7$$$H;W$C$F$$$k$N$G!";H$$$K$/$$$[$ID9$/$7$?e(B
e$B$$$H$O;W$$$^$;$s!#$=$N0UL#$Ge(B Encoding::Detector.open e$B$O$A$g$Ce(B
e$B$HD9$9$.$k$h$&$K;W$$$^$9!#e(B

e$BDL>o$N%9%/%j%W%H$G$O$=$l$[$IB?$/e(BEncDet.opene$B$r;H$&$H$O;W$($Je(B
e$B$$$N$G$9$,!"e(BRDoce$B0J30$G$O$I$&$$$&>l9g$G$7$g$&$+!)e(BRubye$B%9%/%j%We(B
e$B%H0J30!JNc$($Pe(BYAMLe$B!K$K$be(Bcoding:
XXXe$B$r=q$/$h$&$K$H$$$&$3$H$Ge(B
e$B$7$g$&$+!)e(B

e$B$=$l$O3F%U%)!<%^%C%H$NLdBj$J5$$b$7$^$9!#Nc$($P!"e(BXMLe$B$G$Oe(B
encoding=“XXX"e$B$G$9$,!”:#$Ne(BEncDet.detect_encodinge$B$G$OBP1~$7$Fe(B
e$B$$$J$$5$$,$7$^$9!#$=$l$H$b!"3F%U%)!<%^%C%H$G$N%(%s%3!<%G%#%se(B
e$B%0;XDj=q<0$K$bBP1~$7$F$$$/$H$$$&$3$H$G$7$g$&$+!)e(B

e$BHf3SBP>]$N%m%1!<%k0MB8$J$b$N$Oe(B open e$B$Ne(B 4e$BJ8;z$J$N$G$3$l$HF1Eye(B
e$B$ND9$5$rK>$`$N$OL5M}[email protected]$H;W$$$^$9$,!"$"$^$j:9$,3+$-$9$.$k$N$Oe(B
e$B$h$m$7$/$J$$$H46$8$F$$$^$9!#e(B

e$B:#99$$$&$N$b%"%l$J$s$G$9$,!"$=$b$=$b!“e(Bopene$B$H$$$&e(BAPIe$B$O$I$&$+$J$!e(B
e$B$H;W$C$F$$$^$9!#6=L#$,$”$k$N$O!V%U%!%$%k$r3+$$$F%(%s%3!<%G%#e(B
e$B%s%[email protected]_Dj$9$k!W$3$H$G$O$J$/$F!"!Ve(BIOe$B$N%(%s%3!<%G%#%se(B
e$B%[email protected][email protected][email protected]$H;W$$$^$9!#$J$N$G!"0J2<$N$he(B
e$B$&$K;H$($?J}$,$h$$5$$,$7$F$$$^$9!#e(B

File.open(“XXX”) do |f|
f.detect_encoding!

end

e$B>e5-$N$h$&$Je([email protected]$He(BFile.opene$B0J30$Ne(BIOe$B!J$C$]$$$b$N!"Nc$($Pe(B
StringIOe$B!K$G$b%(%s%3!<%G%#%s%08!=P5!G=$,F1$8e(BAPIe$B$G;H$($^$9!#e(B

e$B$b$A$m$s!"%U%!%$%[email protected],[email protected]$1$r%A%’%C%/$7$?$$$+$ie(Bopene$B$+$i<gF3e(B
e$B8"[email protected]$m$&$J$!$H$OA[A|$G$-$^$9$,!"%G!<%?$rFI$_9~$`e(B
e$BA0$K8F$s$G$M!"$G$b==J,$G$O$J$$$+$H$b;W$$$^$9!#%U%!%$%k0J30$Ge(B
e$B$b%(%s%3!<%G%#%s%[email protected]_Dj$7$?$$$3$H$O$"$k$H;W$$$^$9$7!#e(B
e$B!JNc$($Pe(BTempfilee$B$H$+!#!Ke(B

e$B$=$s$J$o$1$G!“e(Bencdetect e$B$+$J$!!”$H;W$C$F$$$^$9!#e(B

encodinge$B$,e(Bence$B$HN,$5$l$F$$$k$N$Oe(BRubye$B$Ne(BCe$B$Ne(BAPIe$B$^$G$G!"$^[email protected](BRuby
e$B%l%Y%k$G$Oe(Bencodinge$B$7$+$J$$$H;W$$$^$9!#e(Bence$B$HN,$7$F$^$GC;$/$9e(B
e$B$k$b$N$G$O$J$$$N$G$O$J$$$+!"$H$O$^[email protected];W$C$F$$$^$9!#e(B

e$B$"$H!"%b%8%e!<%kL>$,F0;le(B(detect)e$B$H$$$&$N$b>/$75$$K$J$j$^$9!#e(B
e$B!J$=$&$$$&$N$O$b$&$9$G$K$?$/$5$s$"$j$^$9$,!#!Ke(B

In article [email protected],
Kouhei S. [email protected] writes:

e$B%G%#%l%/%H%j$r3P$($k$H$$$&>u67$,$h$/$o$+$i$J$$$N$G$9$,!"$I$&e(B
e$B$$$&$H$-$K%G%#%l%/%H%j$r3P$($k$N$G$7$g$&$+!)Nc$($P!“e(B
net/http.rbe$B$r;H$&$H$-$Oe(Bnete$B%G%#%l%/%H%j$r3P$($k!”$H$$$&$3$H$Ge(B
e$B$7$g$&$+!)e(B

e$B$O$$!#3P$($F$$$J$$$He(B require e$B$N0z?t$r=q$1$^$;$s!#e(B

e$B$^$!!"=q$1$J$$$H$$$&[email protected]$$2a$.$+$b$7$l$^$;$s$,!“7P83>ee(B
test/unit e$B$Ge(B require e$B$r=q$/$H$-$K$$$/$i$+8MOG$C$?3P$($,$”$je(B
e$B$^$9!#e(B

e$B;d$O3,AX9=B$!Je(BXXX/YYYe$B!K$K$J$C$F$$$k;~$Oe(BXXXe$B$r3P$($h$&$H$O!J$?e(B
e$B$V$s!K;W$C$F$$$^$;$s$,!“e(BXXXe$B$K4XO”$9$ke(BYYYe$B$H$$$&5!G=$r;H$&!"$He(B
e$B9M$($F$$$k5$$,$7$^$9!#e(B

XXXYYY e$B$de(B XXX-YYY e$B$be(B XXX e$B$K4XO"$9$ke(B YYY
e$B$H$$$&5!G=$r;H$&$H2re(B
e$B<a$G$-$k$s$8$c$J$$$G$7$g$&$+!#e(B

XXX e$B$K4XO"$9$ke(B YYY e$B$H$$$&5!G=$r;H$*$&$H;W$C$?;~!“e(BXXXYYY,
XXX-YYY, XXX/YYY [email protected]$m$&$+!”$H$$$&$N$r;W$$=P$7$d$9e(B
e$B$/$9$k$9$k$K$O$I$&$7$?$i$7$$$+!"$H$$$&$N$,[email protected]$H;W$$$^e(B
e$B$9!#e(B

e$B$^$?!“e(BXXX/e$B0J2<$K%U%!%$%k$,2?8D$”$k$+$r0U<1$7$?$3$H$,$J$$$N$Ge(B
e$B$9$,!"$=$l$r0U<1$9$k$N$O$o$j$HIaDL$N$3$H$J$N$G$7$g$&$+!)e(B
e$B!Je(Bnet/e$B%7%j!<%:$O$$$m$$$m$"$k$J$!$H$+$O;W$C$?$3$H$,$"$k$H;W$$e(B
e$B$^$9!#!Ke(B

e$B;d$N463P$H$7$F$O!“0U<1$7$F$b$*$+$7$/$”$j$^$;$s!#$$$/$D$b$"$le(B
e$B$P!“J,N`$K0UL#$,$”$k$N$,[email protected]$i$+$G3P$($d$9$$$N$G$9$,!"$=$&$G$Je(B
[email protected]$i$+$O$"$j$^$;$s!#e(B

e$B$b$A$m$s!";d$,IaDL$G$"$k$+$I$&$+$O$^$?JL$NOC$K$J$k$N$G!“IaDLe(B
e$B$G$”$k$+$I$&$+$H$$$&<ALd$KEz$($F$$$k$3$H$K$O$J$i$J$$$+$b$7$le(B
e$B$^$;$s$1$l$I!#e(B

e$BDL>o$N%9%/%j%W%H$G$O$=$l$[$IB?$/e(BEncDet.opene$B$r;H$&$H$O;W$($Je(B
e$B$$$N$G$9$,!"e(BRDoce$B0J30$G$O$I$&$$$&>l9g$G$7$g$&$+!)e(BRubye$B%9%/%j%We(B
e$B%H0J30!JNc$($Pe(BYAMLe$B!K$K$be(Bcoding: XXXe$B$r=q$/$h$&$K$H$$$&$3$H$Ge(B
e$B$7$g$&$+!)e(B

e$B$O$$!#$b$H$b$H$3$N7A<0$Oe(B Emacs e$B$de(B Python
e$B$+$iMh$F$$$k$b$N$G!"e(B
Ruby e$B0J30$K$bE,MQ$G$-$^$9!#e(B

e$B$?$H$($P!“F|K\8l$r4^[email protected]%W%l%$%s%F%-%9%H$r=hM}$9$k$H$-$K!”%(e(B
e$B%s%3!<%G%#%s%0$r$I$&;XDj$9$k$+!"$H$+!#e(BEmacs e$B$O<+F0H=JL!"e(BRuby
e$B$Oe(B locale e$B$de(B -K e$B%*%W%7%g%s$H$$$&$h$j$O!"e(Bmagic comment
e$B$H$$$&e(B
e$B$R$H$D$N>pJs$GN>J}[email protected])8f$7$?$[$&$,$$$$$G$7$g$&!#e(B

e$B$J$*!"e(BYAML e$B$O$?$7$+;EMM<+BN$Ke(B UTF-8
e$B$H$$$&5,Dj$,F~$C$F$$$k$he(B
e$B$&$J5$$,$9$k$N$GHyL/$J5$$,$7$^$9!#e(B

e$B$=$l$O3F%U%)!<%^%C%H$NLdBj$J5$$b$7$^$9!#Nc$($P!"e(BXMLe$B$G$Oe(B
encoding=“XXX"e$B$G$9$,!”:#$Ne(BEncDet.detect_encodinge$B$G$OBP1~$7$Fe(B
e$B$$$J$$5$$,$7$^$9!#$=$l$H$b!"3F%U%)!<%^%C%H$G$N%(%s%3!<%G%#%se(B
e$B%0;XDj=q<0$K$bBP1~$7$F$$$/$H$$$&$3$H$G$7$g$&$+!)e(B

e$BI,MW$K$J$l$P$d$C$F$b$$$$$+$b$7$l$^$;$s!#e(B

[email protected]!"e(BXML e$B$Oe(B XML
e$B%Q!<%6!<$,LLE]$r8+$F$/$l$k$h$&$J5$$b$7$^$9!#e(B

e$B>e5-$N$h$&$Je([email protected]$He(BFile.opene$B0J30$Ne(BIOe$B!J$C$]$$$b$N!"Nc$($Pe(B
StringIOe$B!K$G$b%(%s%3!<%G%#%s%08!=P5!G=$,F1$8e(BAPIe$B$G;H$($^$9!#e(B

e$B$R$H$D9M$($F$$$F!">e5-$N$G$O07$($J$$$N$Oe(B Apache e$B$Ne(B
mod_cern_meta e$B$K$h$k7A<0$G$9$M!#7P0^$+$i$$$($Pe(B CERN httpd
e$B$N7Ae(B
e$B<0$H$$$C$?$[$&$,$$$$$s$G$9$,!"e(Bdir/foo e$B$H$$$&%U%!%$%k$KBP$7$Fe(B
dir/.web/foo.meta e$B$Ke(B Content-Type e$B$H$+$r=q$1$k$H$$$&$b$N$G!"e(B
open e$B$9$k%?%$%_%s%0$rJa$^$($J$$$HLdBj$,=P$F$-$^$9!#e(Bchdir e$B$He(B
e$B$+!#e(B

e$B$b$A$m$s!"%U%!%$%[email protected],[email protected]$1$r%A%’%C%/$7$?$$$+$ie(Bopene$B$+$i<gF3e(B
e$B8"[email protected]$m$&$J$!$H$OA[A|$G$-$^$9$,!"%G!<%?$rFI$_9~$`e(B
e$BA0$K8F$s$G$M!"$G$b==J,$G$O$J$$$+$H$b;W$$$^$9!#%U%!%$%k0J30$Ge(B
e$B$b%(%s%3!<%G%#%s%[email protected]_Dj$7$?$$$3$H$O$"$k$H;W$$$^$9$7!#e(B
e$B!JNc$($Pe(BTempfilee$B$H$+!#!Ke(B

e$B$=$&$$$&MQES$,$J$$$H$O$$$$$^$;$s$7!"$=$&$$$&MQES$N$?$a$N%a%=%Ce(B
e$B%I$O$"$C$F$$$$$H$*$b$$$^$9!#e(B

[email protected]!“e(BTempfile e$B$O$=$N%W%m%;%9<+?H$,@8@.$7$?$b$N$G!“Cf?H$K%(e(B
e$B%s%3!<%G%#%s%0$r;XDj$9$kI,[email protected]$O2<$,$k$h$&$J5$$,$7$^$9!#$”$ke(B
e$B$H$7$?$i!“e(BTempfile [email protected]@.$7$?$”$H2?$+%3%^%s%I$r5/F0$7$F$=$3e(B
e$B$K=q$-9~$^$;$F$=$l$rFI$`$H$+$G$7$g$&$+!#$G$b$=$&$9$k$H!”$=$Ne(B
e$B%3%^%s%I$N$3$H$rCN$C$F$$$l$P%(%s%3!<%G%#%s%0$O$o$+$k5$$,$7$^e(B
e$B$9!#6qBNE*$K$O$I$$$&>u67$G4r$7$$$G$7$g$&$Me(B?

e$B$=$s$J$o$1$G!“e(Bencdetect e$B$+$J$!!”$H;W$C$F$$$^$9!#e(B

encodinge$B$,e(Bence$B$HN,$5$l$F$$$k$N$Oe(BRubye$B$Ne(BCe$B$Ne(BAPIe$B$^$G$G!"$^[email protected](BRuby
e$B%l%Y%k$G$Oe(Bencodinge$B$7$+$J$$$H;W$$$^$9!#e(Bence$B$HN,$7$F$^$GC;$/$9e(B
e$B$k$b$N$G$O$J$$$N$G$O$J$$$+!"$H$O$^[email protected];W$C$F$$$^$9!#e(B

e$B>e$G$b=R$Y$^$7$?$,!";HMQIQEY$KBP$9$kA[Dj$,0[$J$C$F$$$k$N$,?)e(B
e$B$$0c$$$N860x$G$9$+$M$’!#e(B

e$B$"$H!"%b%8%e!<%kL>$,F0;le(B(detect)e$B$H$$$&$N$b>/$75$$K$J$j$^$9!#e(B
e$B!J$=$&$$$&$N$O$b$&$9$G$K$?$/$5$s$"$j$^$9$,!#!Ke(B

e$B:#2s$N$O$^$5$K$J$K$+$R$H$D$N$3$H$r9T$&%i%$%V%i%j$J$N$GF0;l$,e(B
e$BCf?H$rI=$7$F$$$k5$$,$7$^$9!#e(B

e$B5!G=$rA}$d$;$POC$OJQ$o$C$F$-$^$9$,!"$J$K$+$"$j$^$9$+$M$’!#e(B
e$B$U$`!"e(Bmagic comment [email protected]@.$9$k5!G=$H$+e(B?

e$B?\F#$G$9!#e(B

e$B$*8_$$$NA0Ds$,7k9=?)$$0c$C$F$$$k$3$H$O$o$+$j$^$7$?!#e(B
[email protected]!"$G!"$I$&$$$&J}8~$K8~$1$l$P<}B+$9$k$N$+$,$o$+$j$^$;e(B
e$B$s!#$I$&$7$h$&!#!#!#e(B

In [email protected]
“[ruby-dev:33906] Re: encdet.rb” on Fri, 22 Feb 2008 13:39:32 +0900,
Tanaka A. [email protected] wrote:

e$B%G%#%l%/%H%j$r3P$($k$H$$$&>u67$,$h$/$o$+$i$J$$$N$G$9$,!"$I$&e(B
e$B$$$&$H$-$K%G%#%l%/%H%j$r3P$($k$N$G$7$g$&$+!)Nc$($P!“e(B
net/http.rbe$B$r;H$&$H$-$Oe(Bnete$B%G%#%l%/%H%j$r3P$($k!”$H$$$&$3$H$Ge(B
e$B$7$g$&$+!)e(B

e$B$O$$!#3P$($F$$$J$$$He(B require e$B$N0z?t$r=q$1$^$;$s!#e(B

e$B$^$!!"=q$1$J$$$H$$$&[email protected]$$2a$.$+$b$7$l$^$;$s$,!“7P83>ee(B
test/unit e$B$Ge(B require e$B$r=q$/$H$-$K$$$/$i$+8MOG$C$?3P$($,$”$je(B
e$B$^$9!#e(B

e$B$?$V$s!“EDCf$5$s$OIaCJ!“e(B”#{e$B%b%8%e!<%kL>e(B.doncase}.rb"e$B$J$N$G:Ge(B
e$B=i$K$=$l$r;n$7$F!”<:GT$7$F!"$=$l$G8MOG$C$?$H$$$&[email protected]$He(B
e$BA[A|$7$F$$$^$9!#e(B

e$B$G$b!"e(Bnet/httpe$B$8$c$J$/$Fe([email protected]$C$?$i8MOG$o$J$$$H$+$$$&$b$Ne(B
e$B$G$b$J$/$F!"IaCJ;H$o$J$$%i%$%V%i%[email protected]$+$i8MOG$C$?$H$$$&$N$b$"e(B
e$B$k$h$&$J5$$,$7$^$9!#e(B

[email protected]!“[email protected]$&$h$&$KLdBj$O”-$G!#e(B

e$B;d$O3,AX9=B$!Je(BXXX/YYYe$B!K$K$J$C$F$$$k;~$Oe(BXXXe$B$r3P$($h$&$H$O!J$?e(B
e$B$V$s!K;W$C$F$$$^$;$s$,!“e(BXXXe$B$K4XO”$9$ke(BYYYe$B$H$$$&5!G=$r;H$&!"$He(B
e$B9M$($F$$$k5$$,$7$^$9!#e(B

XXXYYY e$B$de(B XXX-YYY e$B$be(B XXX e$B$K4XO"$9$ke(B YYY e$B$H$$$&5!G=$r;H$&$H2re(B
e$B<a$G$-$k$s$8$c$J$$$G$7$g$&$+!#e(B

e$B;d$Oe([email protected]$He(BXXXe$B$He([email protected]$l$a$,J,$+$j$E$i$$$N$G$=$3$G>/$78Me(B
e$BOG$&$3$H$,$"$j$^$9!#!JFC$Ke(BWEBricke$B$N$d$D!#!K$J$N$G!";d$OL)$+e(B
e$B$Ke(B"#{e$B%b%8%e!<%kL>e(B.doncase}.rb"e$BIa5Z$r5q$_$?$$$H;W$C$F$$$^$9!#e(B

e$B$J$N$G!"$?$V$s!"e([email protected]$o$J$/$J$k5$$,$7e(B
e$B$^$9!#!Je(Bence$B$K$OH?BP$9$k$H;W$$$^$9$,!#!Ke(B

e$B$G!"LdBj$Oe(B

XXX e$B$K4XO"$9$ke(B YYY e$B$H$$$&5!G=$r;H$*$&$H;W$C$?;~!“e(BXXXYYY,
XXX-YYY, XXX/YYY [email protected]$m$&$+!”$H$$$&$N$r;W$$=P$7$d$9e(B
e$B$/$9$k$9$k$K$O$I$&$7$?$i$7$$$+!"$H$$$&$N$,[email protected]$H;W$$$^e(B
e$B$9!#e(B

[email protected]$H;W$$$^$9!#$=$7$F!";d$N9%$_$Oe(BXXX/YYY or XXX-YYYe$B$GEDCfe(B
e$B$5$s$N$Oe([email protected]$H;W$$$^$9!#e(B

e$B$I$&$7$^$7$g$&!#e(B
e$B%(%s%3!<%G%#%s%04X78$NJL$N5!G=$r9M$($k$N$,$$$$$N$+$7$i!#e(B

e$B$^$?!“e(BXXX/e$B0J2<$K%U%!%$%k$,2?8D$”$k$+$r0U<1$7$?$3$H$,$J$$$N$Ge(B
e$B$9$,!"$=$l$r0U<1$9$k$N$O$o$j$HIaDL$N$3$H$J$N$G$7$g$&$+!)e(B
e$B!Je(Bnet/e$B%7%j!<%:$O$$$m$$$m$"$k$J$!$H$+$O;W$C$?$3$H$,$"$k$H;W$$e(B
e$B$^$9!#!Ke(B

e$B;d$N463P$H$7$F$O!“0U<1$7$F$b$*$+$7$/$”$j$^$;$s!#$$$/$D$b$"$le(B
e$B$P!“J,N`$K0UL#$,$”$k$N$,[email protected]$i$+$G3P$($d$9$$$N$G$9$,!"$=$&$G$Je(B
[email protected]$i$+$O$"$j$^$;$s!#e(B

e$B$&!<$s!"$=$&$G$9$+!#e(B

e$B$?$H$($P!“F|K\8l$r4^[email protected]%W%l%$%s%F%-%9%H$r=hM}$9$k$H$-$K!”%(e(B
e$B%s%3!<%G%#%s%0$r$I$&;XDj$9$k$+!"$H$+!#e(BEmacs e$B$O<+F0H=JL!"e(BRuby
e$B$Oe(B locale e$B$de(B -K e$B%*%W%7%g%s$H$$$&$h$j$O!"e(Bmagic comment e$B$H$$$&e(B
e$B$R$H$D$N>pJs$GN>J}[email protected])8f$7$?$[$&$,$$$$$G$7$g$&!#e(B

e$B$=$l$O$o$+$k$N$G$9$,!"%3%a%s%H7A<0$,$J$$%U%)!<%^%C%H$K$Oe(B
magic commente$B$rDI2C$7$K$/$$$N$G$O$J$$$+$H;W$$$^$9!#Nc$($P!"e(B
CSVe$B$O$I$&$G$7$g$&!#e(B

e$B$J$*!"e(BYAML e$B$O$?$7$+;EMM<+BN$Ke(B UTF-8 e$B$H$$$&5,Dj$,F~$C$F$$$k$he(B
e$B$&$J5$$,$9$k$N$GHyL/$J5$$,$7$^$9!#e(B

UTF-16 LE/BEe$B$b<u$1IU$1$k$N$GMxMQ$7$?$/$J$k$+$b$7$l$^$;$s!#e(B
YAMLe$B%Q!<%5;H$($h!"[email protected]$o$l$l$P$^$!$=$&$J$s$G$9$,!#e(B

e$B$=$l$O3F%U%)!<%^%C%H$NLdBj$J5$$b$7$^$9!#Nc$($P!"e(BXMLe$B$G$Oe(B
encoding=“XXX"e$B$G$9$,!”:#$Ne(BEncDet.detect_encodinge$B$G$OBP1~$7$Fe(B
e$B$$$J$$5$$,$7$^$9!#$=$l$H$b!"3F%U%)!<%^%C%H$G$N%(%s%3!<%G%#%se(B
e$B%0;XDj=q<0$K$bBP1~$7$F$$$/$H$$$&$3$H$G$7$g$&$+!)e(B

e$BI,MW$K$J$l$P$d$C$F$b$$$$$+$b$7$l$^$;$s!#e(B

[email protected]!"e(BXML e$B$Oe(B XML e$B%Q!<%6!<$,LLE]$r8+$F$/$l$k$h$&$J5$$b$7$^$9!#e(B

XMLe$B%U%!%$%k$r3+$$$Fe(Bgsube$B$9$k$H$+!"e(Bgrepe$B$7$?$$$H$+$$$&>l9g$b$"e(B
e$B$k5$$,$7$^$9!#e(B

e$B>e5-$N$h$&$Je([email protected]$He(BFile.opene$B0J30$Ne(BIOe$B!J$C$]$$$b$N!"Nc$($Pe(B
StringIOe$B!K$G$b%(%s%3!<%G%#%s%08!=P5!G=$,F1$8e(BAPIe$B$G;H$($^$9!#e(B

e$B$R$H$D9M$($F$$$F!">e5-$N$G$O07$($J$$$N$Oe(B Apache e$B$Ne(B
mod_cern_meta e$B$K$h$k7A<0$G$9$M!#7P0^$+$i$$$($Pe(B CERN httpd e$B$N7Ae(B
e$B<0$H$$$C$?$[$&$,$$$$$s$G$9$,!"e(Bdir/foo e$B$H$$$&%U%!%$%k$KBP$7$Fe(B
dir/.web/foo.meta e$B$Ke(B Content-Type e$B$H$+$r=q$1$k$H$$$&$b$N$G!"e(B
open e$B$9$k%?%$%_%s%0$rJa$^$($J$$$HLdBj$,=P$F$-$^$9!#e(Bchdir e$B$He(B
e$B$+!#e(B

chdire$B$,$h$/$o$+$J$$$N$G$9$,!“e(Bopene$B$7$?$”$H$G$be(BFile#pathe$B$G$I$&e(B
e$B$K$+$J$i$J$$$b$N$G$7$g$&$+!)e(B

[email protected]!“e(BTempfile e$B$O$=$N%W%m%;%9<+?H$,@8@.$7$?$b$N$G!“Cf?H$K%(e(B
e$B%s%3!<%G%#%s%0$r;XDj$9$kI,[email protected]$O2<$,$k$h$&$J5$$,$7$^$9!#$”$ke(B
e$B$H$7$?$i!“e(BTempfile [email protected]@.$7$?$”$H2?$+%3%^%s%I$r5/F0$7$F$=$3e(B
e$B$K=q$-9~$^$;$F$=$l$rFI$`$H$+$G$7$g$&$+!#$G$b$=$&$9$k$H!”$=$Ne(B
e$B%3%^%s%I$N$3$H$rCN$C$F$$$l$P%(%s%3!<%G%#%s%0$O$o$+$k5$$,$7$^e(B
e$B$9!#6qBNE*$K$O$I$$$&>u67$G4r$7$$$G$7$g$&$Me(B?

e$B$^$5$K$=$N$H$*$j$G!";d$O$h$/%3%^%s%I$N7k2L$rF~$l$k$N$K;H$$$^e(B
e$B$9!#$=$N$H$-!“F~NOCM$,%W%m%0%i%[email protected]@.$7$?$3$H$b$b$A$m$s$"$ke(B e$B$N$G$9$,!"$I$3$+$+$i;}$C$F$-$?$b$N$rF~NO$7$F%3%^%s%I$KDL$7$Fe(B e$B$+$i$=$N7k2L$r%W%m%0%i%$G;H$&$H$$$&$3$H$b$”$j$^$9!#$=$N$H$-e(B
e$B$O%W%m%0%i%`$G$N:G=i$NF~NO$,%3%^%s%I$+$i$N=PNO$J$N$G%(%s%3!<e(B
e$B%G%#%s%0$r8!=P$7$?$/$J$k$H;W$$$^$9!#e(B

e$B$^$?!"$b$7!"<+J,$G%(%s%3!<%G%#%s%0$,J,$+$C$F$$$k>l9g$G$b<+J,e(B
e$B$G%(%s%3!<%G%#%s%0$r;XDj$9$k$h$j$O<+F0$G$d$C$F$/$l$?J}$,3Z$Je(B
e$B$N$G;H$$$?$/$J$k$H;W$$$^$9!#e(B

encodinge$B$,e(Bence$B$HN,$5$l$F$$$k$N$Oe(BRubye$B$Ne(BCe$B$Ne(BAPIe$B$^$G$G!"$^[email protected](BRuby
e$B%l%Y%k$G$Oe(Bencodinge$B$7$+$J$$$H;W$$$^$9!#e(Bence$B$HN,$7$F$^$GC;$/$9e(B
e$B$k$b$N$G$O$J$$$N$G$O$J$$$+!"$H$O$^[email protected];W$C$F$$$^$9!#e(B

e$B>e$G$b=R$Y$^$7$?$,!";HMQIQEY$KBP$9$kA[Dj$,0[$J$C$F$$$k$N$,?)e(B
e$B$$0c$$$N860x$G$9$+$M$’!#e(B

e$B$G$"$l$P!"$d$C$Q$je(Bopene$B$NBhFs0z?t$G;XDj$G$-$k$/$i$$$N;H$$$d$9e(B
e$B$5$^$G4hD%$C$FM_$7$$$G$9!#e(B

e$B$"$H!"%b%8%e!<%kL>$,F0;le(B(detect)e$B$H$$$&$N$b>/$75$$K$J$j$^$9!#e(B
e$B!J$=$&$$$&$N$O$b$&$9$G$K$?$/$5$s$"$j$^$9$,!#!Ke(B

e$B:#2s$N$O$^$5$K$J$K$+$R$H$D$N$3$H$r9T$&%i%$%V%i%j$J$N$GF0;l$,e(B
e$BCf?H$rI=$7$F$$$k5$$,$7$^$9!#e(B

e$B$?$V$s!";d$O!"e(BDetect.opene$B$HF0;l$,$D$J$,$k$N$,[email protected](B
e$B$H;W$$$^$9!#e(B

e$B5!G=$rA}$d$;$POC$OJQ$o$C$F$-$^$9$,!"$J$K$+$"$j$^$9$+$M$’!#e(B
e$B$U$`!"e(Bmagic comment [email protected]@.$9$k5!G=$H$+e(B?

e$B%3%a%s%H$N=q$-J}$,%U%)!<%^%C%H$K$h$C$F0c$&$N$GFq$7$$5$$,$7$^e(B
e$B$9!#e(B

e$B%(%s%3!<%G%#%s%0$r?dB,$9$k5!G=$d8!>Z$9$k5!G=$OAH$9~$$G$7$?$Ce(B
e$B$1!#e(B

In article [email protected],
Kouhei S. [email protected] writes:

e$B$?$V$s!“EDCf$5$s$OIaCJ!“e(B”#{e$B%b%8%e!<%kL>e(B.doncase}.rb"e$B$J$N$G:Ge(B
e$B=i$K$=$l$r;n$7$F!”<:GT$7$F!"$=$l$G8MOG$C$?$H$$$&[email protected]$He(B
e$BA[A|$7$F$$$^$9!#e(B

e$B$h$/$o$+$j$^$;$s!#$3$3$G$$$&%b%8%e!<%kL>$,e(B “Test::Unit” [email protected]$He(B
e$B$9$k$He(B downcase e$B$9$k$He(B test::unit e$B$G!“e(Btest::unit.rb
e$B$,$”[email protected](B
e$B$m$&$H$O;W$$$^$;$s$7!“e(Brequire ‘test::unit’ e$B$H=q$3$&$H$b;W$$e(B
e$B$^$;$s!#$=$l$O$”$^$j$K47=,$+$iN%$l$9$.$F$$$^$9!#$G$9$+$i!“e(B
“#{e$B%b%8%e!<%kL>e(B.doncase}.rb” e$B$GI=8=$7$?$+$C$?$N$O$=$l$G$O$Je(B
e$B$$$H;W$&$N$G$9$,!”$=$l$,$J$s$J$N$+$H$$$&$N$,$o$+$j$^$;$s!#e(B

e$B$G$b!"e(Bnet/httpe$B$8$c$J$/$Fe([email protected]$C$?$i8MOG$o$J$$$H$+$$$&$b$Ne(B
e$B$G$b$J$/$F!"IaCJ;H$o$J$$%i%$%V%i%[email protected]$+$i8MOG$C$?$H$$$&$N$b$"e(B
e$B$k$h$&$J5$$,$7$^$9!#e(B

e$B:[email protected]$1$G$O$J$/!“e(Brequire e$B$r=q$/$?$S$K!”$J$<I,[email protected]$b$J$$$N$Ke(B
“/” e$B$,I,MW$K$7$F$"$k$N$+J0$j$r46$8$?$N$G!"IaCJ;H$o$J$$$+$i!"e(B
e$B$H$$$&[email protected][email protected]@$G$-$^$;$s!#e(B

e$B;d$Oe([email protected]$He(BXXXe$B$He([email protected]$l$a$,J,$+$j$E$i$$$N$G$=$3$G>/$78Me(B
e$BOG$&$3$H$,$"$j$^$9!#!JFC$Ke(BWEBricke$B$N$d$D!#!K$J$N$G!";d$OL)$+e(B
e$B$Ke(B"#{e$B%b%8%e!<%kL>e(B.doncase}.rb"e$BIa5Z$r5q$_$?$$$H;W$C$F$$$^$9!#e(B

e$B:G=i$K=R$Y$?$h$&$K!“e(B”#{e$B%b%8%e!<%kL>e(B.doncase}.rb"
e$B$,$J$K$r<(e(B
e$B$7$F$$$k$N$+$h$/$o$+$i$J$$$N$G!"$J$s$H$b$$$($^$;$s!#e(B

e$B$J$!“e(BWEBrick e$B$K$D$$$F$O!”;d$O4pK\E$Ke(B require ‘webrick’
e$B$9e(B
e$B$k$3$H$K$7$F$$$^$9!#e(B

e$B$J$N$G!"$?$V$s!"e([email protected]$o$J$/$J$k5$$,$7e(B
e$B$^$9!#!Je(Bence$B$K$OH?BP$9$k$H;W$$$^$9$,!#!Ke(B

e$B%O%$%U%s$r;H$C$F$$$k$N$Oe(B open-uri e$B$He(B resolv-replace
e$B$G$9$,!"e(B
e$B$I$A$i$b<g$J;HMQK!$G$O%b%8%e!<%k$r;H$o$J$$$s$G$9$h$M$’!#e(B
e$B$I$A$i$b;d$,:n$C$?$b$N$G$9$,!#e(B

[email protected]$H;W$$$^$9!#$=$7$F!";d$N9%$_$Oe(BXXX/YYY or XXX-YYYe$B$GEDCfe(B
e$B$5$s$N$Oe([email protected]$H;W$$$^$9!#e(B

open-uri e$B$J$I$NNc$r9M$([email protected]$1$l$P$o$+$k$H;W$&$N$G$9$,!“e(B
e$B;d$,e(B XXXYYY e$B$G$J$$$b$N$rA*$V$3$H$O$”$j$^$9!#e(B

e$BLdBj$O$=$b$=$bJ,N`$9$Y$-$+$I$&$+$H$$$&[email protected]$H;W$$$^$9!#e(B

e$B$I$&$7$^$7$g$&!#e(B
e$B%(%s%3!<%G%#%s%04X78$NJL$N5!G=$r9M$($k$N$,$$$$$N$+$7$i!#e(B

e$B>-MhE*$K!";w$?5!G=$d4XO"[email protected]_CV$9$k>l=j$K:$$i$J$$$h$&e(B
e$B$K$7$?$$$H$O;W$$$^$9$N$G!“6qBNNc$,$”$l$P$<$R9M$($?$$$H;W$$$^e(B
e$B$9!#e(B

e$B5!G=$r%(%s%3!<%G%#%s%04X780lHL$K$^$GA}$d$7$F$7$^$C$Fe(B
encoding.rb e$B$H$$$&$N$O2DG=$+$J$!!#e(B

e$B$=$l$O$o$+$k$N$G$9$,!"%3%a%s%H7A<0$,$J$$%U%)!<%^%C%H$K$Oe(B
magic commente$B$rDI2C$7$K$/$$$N$G$O$J$$$+$H;W$$$^$9!#Nc$($P!"e(B
CSVe$B$O$I$&$G$7$g$&!#e(B

e$B$O$$!#%3%a%s%H7A<0$,$J$$$N$OFq$7$$$G$9$M!#e(B
CERN httpd e$B$N7A<0$O$=$&$$$&$H$-$G$b;H$($^$9$,!#e(B

UTF-16 LE/BEe$B$b<u$1IU$1$k$N$GMxMQ$7$?$/$J$k$+$b$7$l$^$;$s!#e(B
YAMLe$B%Q!<%5;H$($h!"[email protected]$o$l$l$P$^$!$=$&$J$s$G$9$,!#e(B

e$B$"$!!"$?$7$+$Ke(B YAML e$B$Oe(B UTF-16
e$B$b;EMM$K$O$$$C$F$$$^$9$M!#5-21e(B
e$B0c$$$r$7$F$^$7$?!#e(B

[email protected]!"$=$&$K$7$F$be(B YAML e$B$N;EMM$I$*$j$NF0:n$r5a$a$k$J$ie(B YAML
e$B%Q!<%6$r;H$&$N$,6Z$G!"E,Ev$K8!=P$9$k$H$$$&$N$O$A$g$C$HMpK=$Ge(B
e$B$9$h$M!#e(B

e$B$=$NE,Ev$5$,[email protected]!"$H$$$&>l9g$K$O$$$$$G$7$g$&$,!#e(B

XMLe$B%U%!%$%k$r3+$$$Fe(Bgsube$B$9$k$H$+!"e(Bgrepe$B$7$?$$$H$+$$$&>l9g$b$"e(B
e$B$k5$$,$7$^$9!#e(B

e$B$(!<$H!"$=$NE,Ev$5$,[email protected]!"$H$$$&e(B (e$B0J2<N,e(B)

chdire$B$,$h$/$o$+$J$$$N$G$9$,!“e(Bopene$B$7$?$”$H$G$be(BFile#pathe$B$G$I$&e(B
e$B$K$+$J$i$J$$$b$N$G$7$g$&$+!)e(B

File#path e$B$,AjBP%Q%9$J>l9g!“e(Bchdir e$B$5$l$F$7$^$&$H!”;X$7$F$$$ke(B
e$B>l=j$,JQ$o$C$F$7$^$$$^$9!#e(B

e$B$^$5$K$=$N$H$*$j$G!";d$O$h$/%3%^%s%I$N7k2L$rF~$l$k$N$K;H$$$^e(B
e$B$9!#$=$N$H$-!“F~NOCM$,%W%m%0%i%[email protected]@.$7$?$3$H$b$b$A$m$s$"$ke(B e$B$N$G$9$,!"$I$3$+$+$i;}$C$F$-$?$b$N$rF~NO$7$F%3%^%s%I$KDL$7$Fe(B e$B$+$i$=$N7k2L$r%W%m%0%i%$G;H$&$H$$$&$3$H$b$”$j$^$9!#$=$N$H$-e(B
e$B$O%W%m%0%i%`$G$N:G=i$NF~NO$,%3%^%s%I$+$i$N=PNO$J$N$G%(%s%3!<e(B
e$B%G%#%s%0$r8!=P$7$?$/$J$k$H;W$$$^$9!#e(B

e$B$^$?!"$b$7!"<+J,$G%(%s%3!<%G%#%s%0$,J,$+$C$F$$$k>l9g$G$b<+J,e(B
e$B$G%(%s%3!<%G%#%s%0$r;XDj$9$k$h$j$O<+F0$G$d$C$F$/$l$?J}$,3Z$Je(B
e$B$N$G;H$$$?$/$J$k$H;W$$$^$9!#e(B

e$B8!=P$7$?$/$J$k$N$O$o$+$k$N$G$9$,!">u67$,$&$^$/%$%a!<%8$G$-$^e(B
e$B$;$s!#e(B

e$B8=:_Ds0FCf$N$Oe(B magic comment e$B$He(B BOM
e$B$7$+07$$$^$;$s$+$i!"%3%^e(B
e$B%s%I$,e(B magic comment e$B$+e(B BOM
[email protected]@.$9$k$H$-$K$7$+;H$($^$;$s!#e(B

e$B;d$N7P83$+$i$$$&$H!"%3%^%s%I$,=PNO$Ke(B magic comment e$B$de(B BOM
e$B$re(B
e$B$D$1$k$H$$$&$N$O>/$J$/$H$be(B Unix e$B$G$O$"$^$j$J$$$N$G$O$J$$$+$He(B
e$B;W$$$^$9!#e(B

e$B$=$&$9$k$H!"$$$/[email protected]$,9M$($i$l$^$9!#e(B

  • e$B;d$,[email protected]$1$G!"=PNO$Ke(B magic comment e$B$de(B BOM
    e$B$r$D$1$k%3e(B
    e$B%^%s%I$,$"$ke(B

  • magic comment e$B$He(B BOM e$B0J30$N8!=PJ}K!$rDI2C$9$ke(B (guess
    e$B$H$+e(B)

  • e$B%3%^%s%I$NF~NO$Ke(B magic comment e$B$de(B BOM
    e$B$,$"$C$F!"$=$l$,=PNOe(B
    e$B$K;D$C$F$$$ke(B (sed e$B$H$+e(B? grep [email protected]$H>C$($F$7$^$$$=$&e(B)

e$BA[Dj$5$l$F$$$k$N$O$I$s$J>u67$J$s$G$7$g$&$+e(B?

e$B$G$"$l$P!"$d$C$Q$je(Bopene$B$NBhFs0z?t$G;XDj$G$-$k$/$i$$$N;H$$$d$9e(B
e$B$5$^$G4hD%$C$FM_$7$$$G$9!#e(B

e$B;d$O$=$&$7$?$$$H$O;W$C$F$$$^$;$s!#e(B
e$B$=$&$$$&Ds0F$KH?BP$O$7$^$;$s$,!#e(B

e$B$?$V$s!";d$O!"e(BDetect.opene$B$HF0;l$,$D$J$,$k$N$,[email protected](B
e$B$H;W$$$^$9!#e(B

e$B$J$k$[$I!#e(B

e$B%3%a%s%H$N=q$-J}$,%U%)!<%^%C%H$K$h$C$F0c$&$N$GFq$7$$5$$,$7$^e(B
e$B$9!#e(B

e$B$($’!"$G$9$+$i!"@8@.$9$k$N$Oe(B magic comment e$B$NItJ,[email protected]$1$G!"%3e(B
e$B%a%s%H$O8F=PB&$,$I$&$K$+$9$k$3$H$K$J$k$G$7$g$&!#e(B

e$BNc$($P!"e(B(e$BL>A0$O$H$b$+$/$H$7$Fe(B)
EncDet.make_magic_comment(“euc-jp”) e$B$,e(B
“-- coding: euc-jp --” e$B$rJV$9$H$+!#e(B

e$B%(%s%3!<%G%#%s%0$r?dB,$9$k5!G=$d8!>Z$9$k5!G=$OAH$9~$$G$7$?$Ce(B
e$B$1!#e(B

String#valid_encoding? e$B$OAH$9~$$G$9!#e(B

NKF.guess e$B$_$?$$$J?dB,$OAH$9~$$G$O$"$j$^$;$s$M!#e(B

guess e$B$r$D$1$k$H$$$&0F$O$"$k$+$b$7$l$^$;$s$,!"[email protected])e(B
e$B$K<BAu$9$k$3$H$O8=<BE*$+!"$H$$$&LdBj$,$"$j$^$9!#8@8l$r%Q%i%a!<e(B
e$B%?$H$+%a%=%C%IL>$N0lIt$K$9$k$H$$$&<j$O$"$j$^$9$,!#e(B

e$B?\F#$G$9!#e(B

e$B<}B+$7$J$$5$$b$9$k$N$G$H$j$"$($:$^$H$a$F$*$-$^$9!#e(B
e$B!JC/$+=u$1$F!Ke(B

  • e$B%(%s%3!<%G%#%s%08!=P5!G=$NF3F~e(B

    e$BEDCf$5$se(B: e$BDs0Fe(B
    e$BB>$N?M!J$^$D$b$H$5$s4^$`!Ke(B: e$B;[email protected](B or e$BH?BP$7$J$$e(B

  • e$B%b%8%e!<%kL>e(B

    e$BEDCf$5$se(B: EncDet ->? EncDetect
    e$B!J$h$/;[email protected]$+$iC;$/$7$?$$!Ke(B
    e$B%(%s%3!<%G%#%s%04XO"$N5!G=$,JL$KA}$($k$N$J$ie(B
    Encoding::XXXe$B$G$b2D!)e(B
    e$B?\F#e(B: Encoding::Detector
    * e$B>JN,[email protected]$+$o$+$i$J$$e(B
    * e$B$=$s$J$K;H$&[email protected]$m$&e(B
    e$BB>$N?Me(B: e$B$$$m$$$me(B

    e$B%U%!%$%kL>$J$I$O%b%8%e!<%kL>$,7h$^$l$PIU?o$7$F7h$^$k$O$:e(B

  • e$B%U%!%$%k$r3+$$$F8!=P$7$?%(%s%3!<%G%#%s%[email protected]_Dj$9e(B
    e$B$k5!G=!Je(BEncDetect.opene$B!Ke(B

    e$BEDCf$5$se(B:
    e$B8!=P$N$?$a$K$O%U%!%$%ke(Bopene$B;~$K=hM}$r9T$&I,MW$,e(B
    e$B$"$k$N$Ge(Bopene$B$7$F%(%s%3!<%G%#%s%0$r8!=P!&@_Dj$9e(B
    e$B$ke(BAPIe$B$,$$$$e(B

    e$B?\F#e(B:
    opene$B$9$k$H$3$m$^$G4^$`$H%U%!%$%k0J30$K;H$($J$$$+$ie(BIOe$B$Ke(B
    e$B%(%s%3!<%G%#%s%0$r8!=P!&@_Dj$9$ke(B
    APIe$B!Je(Bio.detect_encoding!e$B!K$rDI2C$7$F!“e(Bopene$B$H$OFHN)e(B
    e$B$K;H$($ke(BAPIe$B$,$$$$!#$G$b!”;H$&$H$-$Oe(Breade$B$9$kA0$H$+e(B
    e$B$K8F$s$G$M!"$H$$$&Cm0U$,I,MW!#e(B

In [email protected]
“[ruby-dev:33933] Re: encdet.rb” on Mon, 25 Feb 2008 17:01:13 +0900,
Tanaka A. [email protected] wrote:

e$B$G$b!"e(Bnet/httpe$B$8$c$J$/$Fe([email protected]$C$?$i8MOG$o$J$$$H$+$$$&$b$Ne(B
e$B$G$b$J$/$F!"IaCJ;H$o$J$$%i%$%V%i%[email protected]$+$i8MOG$C$?$H$$$&$N$b$"e(B
e$B$k$h$&$J5$$,$7$^$9!#e(B

e$B:[email protected]$1$G$O$J$/!“e(Brequire e$B$r=q$/$?$S$K!”$J$<I,[email protected]$b$J$$$N$Ke(B
“/” e$B$,I,MW$K$7$F$"$k$N$+J0$j$r46$8$?$N$G!"IaCJ;H$o$J$$$+$i!"e(B
e$B$H$$$&[email protected][email protected]@$G$-$^$;$s!#e(B

e$B;d$Oe(B"/“e$B$,:YJ,2=$H$+%0%k!<%W2=$H$+6qBN2=$5$l$F$$$k!”$H$$$&$he(B
e$B$&$J%$%a!<%8$,$"$k$N$G!"e(Bnet/httpe$B$O%M%C%H%o!<%/4X78$Ne(BHTTPe$B$H$$e(B
e$B$&Iw$K;W$$!"J0$j$O46$8$^$;$s$G$7$?!#%G%#%l%/%H%[email protected]$j$,e(B
"/"e$B$J$N$K1F6A$r<u$1$F$$$k$N$+$b$7$l$^$;$s!#e(B

e$B;d$Oe([email protected]$He(BXXXe$B$He([email protected]$l$a$,J,$+$j$E$i$$$N$G$=$3$G>/$78Me(B
e$BOG$&$3$H$,$"$j$^$9!#!JFC$Ke(BWEBricke$B$N$d$D!#!K$J$N$G!";d$OL)$+e(B
e$B$Ke(B"#{e$B%b%8%e!<%kL>e(B.doncase}.rb"e$BIa5Z$r5q$_$?$$$H;W$C$F$$$^$9!#e(B

e$B:G=i$K=R$Y$?$h$&$K!“e(B”#{e$B%b%8%e!<%kL>e(B.doncase}.rb" e$B$,$J$K$r<(e(B
e$B$7$F$$$k$N$+$h$/$o$+$i$J$$$N$G!"$J$s$H$b$$$($^$;$s!#e(B

XxxYyye$B$H$$$&%b%8%e!<%k$Oe(Bxxxyyy.rbe$B$H$$$&%U%!%$%kL>$K$9$k$H$$e(B
e$B$&=,[email protected]$$$?$+$C$?$N$G$7$?!#e(B

e$BLdBj$O$=$b$=$bJ,N`$9$Y$-$+$I$&$+$H$$$&[email protected]$H;W$$$^$9!#e(B

e$B;d$O!V%(%s%3!<%G%#%s%04XO"$N5!G=!W$N!V8!=P5!G=!W$H$$$&Iw$K9Me(B
e$B$($F$7$^$&$s$G$h$M!#$?$H$(!":#$O!V%(%s%3!<%G%#%s%04XO"$N5!G=!We(B
e$B$,0l$D$7$+$J$/$F$b!#e(B

XMLe$B%U%!%$%k$r3+$$$Fe(Bgsube$B$9$k$H$+!"e(Bgrepe$B$7$?$$$H$+$$$&>l9g$b$"e(B
e$B$k5$$,$7$^$9!#e(B

e$B$(!<$H!"$=$NE,Ev$5$,[email protected]!"$H$$$&e(B (e$B0J2<N,e(B)

e$B$R$H$D6qBNNc$r$"$2$k$H!“e(BSF.nete$B$Ke(BHTMLe$B!JA4It$,e(BXHTMLe$B$H$$$&$o$1$Ge(B
e$B$O$J$$$G$9$,!K$r%”%C%W%m!<%I$9$k;~$Ke(BSF.nete$B$N%m%4$rF~$l$k$H$-e(B
e$B$K;H$&$3$H$,$"$j$^$9!#!Je(BSF.nete$B$K%"%C%W%m!<%I$9$ke(BHTMLe$B$K$Oe(B
SF.nete$B$N%m%4$rF~$l$J$-$c$$$1$J$$$N$G!#!Ke(B

html = html.gsub(//, “<img …>\n”)

e$B$3$&$$$&$H$-$K$Oe(BXMLe$B%Q!<%5$r;H$&$N$OLLE]$K$J$j$^$9!#e(B

e$B$^$!!"$I$&$G$b$$$$$G$9$M!#e(B

chdire$B$,$h$/$o$+$J$$$N$G$9$,!“e(Bopene$B$7$?$”$H$G$be(BFile#pathe$B$G$I$&e(B
e$B$K$+$J$i$J$$$b$N$G$7$g$&$+!)e(B

File#path e$B$,AjBP%Q%9$J>l9g!“e(Bchdir e$B$5$l$F$7$^$&$H!”;X$7$F$$$ke(B
e$B>l=j$,JQ$o$C$F$7$^$$$^$9!#e(B

chdire$B$9$kA0$Ke(Bfile.detect_encoding!e$B!J2>!K$7$F$M!"$H$$$&$N$G$Oe(B
e$B<e$$$G$7$g$&$+!)e(B

e$B;d$N7P83$+$i$$$&$H!"%3%^%s%I$,=PNO$Ke(B magic comment e$B$de(B BOM e$B$re(B
e$B$D$1$k$H$$$&$N$O>/$J$/$H$be(B Unix e$B$G$O$"$^$j$J$$$N$G$O$J$$$+$He(B
e$B;W$$$^$9!#e(B

e$B$?$7$+$K$=$&$G$9$M!#JQ$J$H$3$m$G4hD%$m$&$H$7$F$7$^$$$^$7$?!#e(B

StringIOe$B$de(BTempfilee$B$J$Ie(BIOe$B$C$]$$%U%!%$%k0J30$N$b$N$K$b;H$$$?$/e(B
e$B$J$$!)[email protected][email protected]$1$G$7$?!#e(B

e$B$G$"$l$P!"$d$C$Q$je(Bopene$B$NBhFs0z?t$G;XDj$G$-$k$/$i$$$N;H$$$d$9e(B
e$B$5$^$G4hD%$C$FM_$7$$$G$9!#e(B

e$B;d$O$=$&$7$?$$$H$O;W$C$F$$$^$;$s!#e(B

e$B$d$O$j!"e(BEncDet.opene$B$,$=$l$[$I$?$/$5$s;H$o$l$k$b$N$J$N$+$,$o$+e(B
e$B$j$^$;$s!#e(B

e$B:#$N$H$3$m!“6qBNNc$H$7$Fe(BRDoce$B$G$Ne(BRubye$B%9%/%j%W%H$NFI$9~$!”$He(B
e$B$$$&$N$,$G$F$$$^$9$,!"$=$l0J30$N>l9g$G;H$o$l$k$3$H$OB?$$$N$Ge(B
e$B$7$g$&$+!)$H$$$&$N$b!"%9%/%j%W%H$rFI$_9~$$3$H$O$=$s$J$K$J$$e(B e$B$N$G$O$J$$$+$H;W$C$F$$$k$+$i$G$9!#e(BPythone$B$de(BEmacse$B$GJT=8$9$k%U%!e(B e$B%$%k$Ge(Bmagic commente$B$r;H$C$F$$$k$N$O$o$+$k$N$G$9$,!"$=$l$i$Ne(B e$B%U%!%$%k$rFI$_9~$$3$H$,B?$$$N$+$,$o$+$j$^$;$s!#e(B

e$B$^$?!“e(BCERN httpde$B7A<0$O$h$/;H$o$l$F$$$k$N$+!”$=$7$F$=$l$rMxMQe(B
e$B$7$?%U%!%$%k$rFI$_9~$`$3$H$OB?$$$N$+$H$$$&$N$b$o$+$j$^$;$s!#e(B

e$B$=$&$$$&>lLL$,B?$$$N$G$"$l$PL>A0$rC;$/$7$?$$$H$$$&M_5a$O$o$+e(B
e$B$i$J$/$b$J$$$G$9!#[email protected]!";d$N7P83$G$O$=$s$J$K$J$$$s$8$c$J$$$+e(B
e$B$J$!$H$$$&46$8$G$9!#e(B

e$B%3%a%s%H$N=q$-J}$,%U%)!<%^%C%H$K$h$C$F0c$&$N$GFq$7$$5$$,$7$^e(B
e$B$9!#e(B

e$B$($’!"$G$9$+$i!"@8@.$9$k$N$Oe(B magic comment e$B$NItJ,[email protected]$1$G!"%3e(B
e$B%a%s%H$O8F=PB&$,$I$&$K$+$9$k$3$H$K$J$k$G$7$g$&!#e(B

e$BNc$($P!"e(B(e$BL>A0$O$H$b$+$/$H$7$Fe(B)
EncDet.make_magic_comment(“euc-jp”) e$B$,e(B
“-- coding: euc-jp --” e$B$rJV$9$H$+!#e(B

e$B$&!<$s!";H$$$d$9$$$G$7$g$&$+!#e(B
e$B$b$7!":#8ee(BXMLe$B$r%5%]!<%H$7$?>l9g$O",$N7A<0$O;H$($^$;$s$h$M!#e(B
e$B8!=P$Oe(Bmagic commente$B0J30$b4hD%$k$1$I!"=PNO$Oe(Bmagic
commente$B$N$_e(B
e$B%5%]!<%H$H$$$&$N$G$b$$$$$G$7$g$&$1$I!"=PNO$b%i%$%V%i%j$,$&$^e(B
e$B$$6q9g$K4hD%$C$F$[$7$$5$$,$7$^$9!#!J$d$k$J$i!Ke(B

In article [email protected],
Kouhei S. [email protected] writes:

e$B<}B+$7$J$$5$$b$9$k$N$G$H$j$"$($:$^$H$a$F$*$-$^$9!#e(B
e$B!JC/$+=u$1$F!Ke(B

e$B2pF~$9$k?M$O$$$J$$$_$?$$$G$9$M$’!#e(B

e$B?\F#e(B: opene$B$9$k$H$3$m$^$G4^$`$H%U%!%$%k0J30$K;H$($J$$$+$ie(BIOe$B$Ke(B
      e$B%(%s%3!<%G%#%s%0$r8!=P!&@_Dj$9$ke(B
      APIe$B!Je(Bio.detect_encoding!e$B!K$rDI2C$7$F!"e(Bopene$B$H$OFHN)e(B
      e$B$K;H$($ke(BAPIe$B$,$$$$!#$G$b!";H$&$H$-$Oe(Breade$B$9$kA0$H$+e(B
      e$B$K8F$s$G$M!"$H$$$&Cm0U$,I,MW!#e(B

e$B$=$&$$$&e(B API e$B$,B8:$7$F$O$J$i$J$$$H$O9M$($F$$$^$;$s!#e(B
e$B;d$,Bh0l$KM
$7$$$b$N$O$=$l$G$O$"$j$^$;$s$,!#e(B

e$B;d$Oe(B"/“e$B$,:YJ,2=$H$+%0%k!<%W2=$H$+6qBN2=$5$l$F$$$k!”$H$$$&$he(B
e$B$&$J%$%a!<%8$,$"$k$N$G!"e(Bnet/httpe$B$O%M%C%H%o!<%/4X78$Ne(BHTTPe$B$H$$e(B
e$B$&Iw$K;W$$!"J0$j$O46$8$^$;$s$G$7$?!#%G%#%l%/%H%[email protected]$j$,e(B
"/"e$B$J$N$K1F6A$r<u$1$F$$$k$N$+$b$7$l$^$;$s!#e(B

net/http e$B$Oe(B net e$B$N2<$K$$$/$D$b$"$k$N$GJ0$j$O46$8$^$;$s!#e(B
e$BJ0$j$r46$8$k$N$Oe(B test/unit e$B$G$9!#e(B

XxxYyye$B$H$$$&%b%8%e!<%k$Oe(Bxxxyyy.rbe$B$H$$$&%U%!%$%kL>$K$9$k$H$$e(B
e$B$&=,[email protected]$$$?$+$C$?$N$G$7$?!#e(B

e$B$U$`!#[email protected]$+$i$H$$$C$Fe(B XxxYyy e$B$H$$$&%b%8%e!<%k$re(B xxx/yyy.rb
e$B$He(B
e$B$$$&%U%!%$%kL>$K$9$k$N$O$+$J$j47=,$KH?$7$^$9$+$i!"e(Bxxx-yyy.rb
e$B$K$9$k$+!"e(BXxxYyy e$B$H$$$&%b%8%e!<%kL>$O$D$1$k$Y$-$G$O$J$$$H$$e(B
e$B$&$h$&$K2r<a$G$-$^$9!#e(B

e$B$=$7$F!“e(Bxxx-yyy.rb e$B$O8=:_$N$H$3$m%b%8%e!<%kL>$O$”$^$j4X78$Je(B
e$B$$7A$G$7$+;H$o$l$F$$$J$$$N$G!"$3$l$^$?47=,$KH?$7$^$9!#e(B

e$B$H$$$&$3$H$O!“7k6I!“e(BXxxYyy e$B$H$$$&%b%8%e!<%kL>$r$D$1$k$3$H$Ke(B
e$BH?BP$7$F$$$k$H2r<a$G$-$k$N$G$9$,!”$”$C$F$^$9$+e(B?

e$BLdBj$O$=$b$=$bJ,N`$9$Y$-$+$I$&$+$H$$$&[email protected]$H;W$$$^$9!#e(B

e$B;d$O!V%(%s%3!<%G%#%s%04XO"$N5!G=!W$N!V8!=P5!G=!W$H$$$&Iw$K9Me(B
e$B$($F$7$^$&$s$G$h$M!#$?$H$(!":#$O!V%(%s%3!<%G%#%s%04XO"$N5!G=!We(B
e$B$,0l$D$7$+$J$/$F$b!#e(B

e$B;d$O!"ITMW$JJ,N`$OHr$1$?$$$H;W$C$F$$$^$9!#e(B

e$BJ,N$9$k$HL>A0$,D9$/$J$C$F;H$$$K$/$/$J$j$^$9$7!";d$N;W9M$OITe(B e$BMW$JJ,N$KJ0$j$r46$8$k$h$&$K$G$-$F$$$k$h$&$G$9!#e(B

e$B$b$A$m$s!“I,MW$JJ,N`$OI,MW$G$”$j!“J0$j$b46$8$^$;$s$,!”:#2s$Ne(B
e$B$O$$$^$N$H$3$mI,MW$G$"$k$+$I$&$+$O$O$C$-$j$7$^$;$s!#e(B

RAA e$B$de(B freshmeat e$B$de(B sourceforge e$B$de(B CPAN
e$B$G$7$P$i$/%(%s%3!<%G%#e(B
e$B%s%0$^$o$j$N%i%$%V%i%j$r8!:w$7$F$_$?7k2L$H$7$F$O!"%(%s%3!<%G%#e(B
e$B%s%0$KD>@\4XO"$9$k%i%$%V%i%j$H$7$F$OJQ49!&?dB,!&=$I|$"$?$j$,e(B
e$B$"$j$,$A$J$h$&$G$9!#$b$&[email protected]?dB,!“9TKv8!=P$“e(B
e$B$?$j$,F~$C$F$/$k$+$b$7$l$^$;$s!#e(B([email protected]?dB,$O%(%s%3!<%G%#%s%0e(B
e$B?dB,$HL)@$K4XO”$7$F$$$^$9$,!#e(B) e$B$5$i$K9-$2$k$H%m!<%^;z$+$JJQe(B
e$B49$H$+BgJ8;z>.J8;zJQ49$H$+$,F~$C$F$-$^$9$,!”$3$N$X$s$K$J$k$He(B
e$B%(%s%3!<%G%#%s%0$OC1$J$kF;6q$G!"%(%s%3!<%G%#%s%04XO"$N5!G=$He(B
e$B$O$$$($J$$$h$&$J5$$b$7$^$9!#e(B

e$B;d$N0u>]$H$7$F$O$=$s$J$K9-$,$i$J$=$&$G!"J,N$NI,[email protected]$O$"$^$je(B e$B46$F$$$^$;$s!#[email protected]!"e(BUnicode e$B$J%7%9%F%$G$O%(%s%3!<%G%#%s%0$Ke(B
e$B4X$9$k=hM}$,303&$H$N$d$j$H$j$N$H$3$m$K=8Cf$9$k$N$,EvA3$G!“JQe(B
e$B49$,4pK$K$J$k$N$bMF0W$KA[A|$G$-$k$o$1$G$9$,!“e(BRuby e$B$G$O303&e(B
e$B$H$N$d$j$H$j$N$H$3$m$K=8Cf$7$J$$e(B (e$B$h$&$K$b=q$1$ke(B)
e$B$N$G!”$J$Ke(B
e$B$+0c$&<oN`$N5!G=$,I,MW$H$5$l$k$3$H$b$”[email protected]$k$N$+$b$7$l$^$;$s!#e(B

e$BJ,N`$NI,[email protected]$K4X$9$k7hCG$rCY$i$;$kJ}K!$H$7$F$Oe(B
Encoding.detection_open e$B$H$+$K$7$Fe(B encoding.rb e$B$K$9$k$H$$$&e(B
e$BJ}K!$,$"$j$^$9$,!";d$N463P$+$i$9$k$H$A$g$C$HD9$$$s$G$9$h$M$’!#e(B

e$B$R$H$D6qBNNc$r$"$2$k$H!“e(BSF.nete$B$Ke(BHTMLe$B!JA4It$,e(BXHTMLe$B$H$$$&$o$1$Ge(B
e$B$O$J$$$G$9$,!K$r%”%C%W%m!<%I$9$k;~$Ke(BSF.nete$B$N%m%4$rF~$l$k$H$-e(B
e$B$K;H$&$3$H$,$"$j$^$9!#!Je(BSF.nete$B$K%"%C%W%m!<%I$9$ke(BHTMLe$B$K$Oe(B
SF.nete$B$N%m%4$rF~$l$J$-$c$$$1$J$$$N$G!#!Ke(B

e$B$o$+$C$?$&$($G$d$j$?$1$l$P$d$l$P$$$$$s$8$c$J$$$G$7$g$&$+!#e(B

chdire$B$9$kA0$Ke(Bfile.detect_encoding!e$B!J2>!K$7$F$M!"$H$$$&$N$G$Oe(B
e$B<e$$$G$7$g$&$+!)e(B

e$B$=$&$$$&Cm0U$,ITMW$Je(B API e$B$r%G%6%$%s2DG=$J$N$K!"$J$<$o$6$o$6e(B
e$B%f!<%6$,LdBj$KCm0U$7$J$1$l$P$J$i$J$$e(B API e$B$r9%$`$N$G$7$g$&e(B?

StringIOe$B$de(BTempfilee$B$J$Ie(BIOe$B$C$]$$%U%!%$%k0J30$N$b$N$K$b;H$$$?$/e(B
e$B$J$$!)[email protected][email protected]$1$G$7$?!#e(B

e$B6qBNNc$O$I$s$J$N$,$"$k$s$G$7$g$&e(B?

StringIO e$B$de(B Tempfile e$B$K$D$$$F%(%s%3!<%G%#%s%0$r$I$&07$&$N$,e(B
[email protected]$7$$$+$H$$$&$3$H$r9M$($k$H!"[email protected]@.$7$?$d$j$+$?e(B
e$B$r9M$($F%(%s%3!<%G%#%s%[email protected]$k$N$,@5$7$$$h$&$K;W$($^$9!#e(B

e$B$=$l$G$O$&$^$/$J$$!"$H$$$&Nc$K$O$I$s$J$N$,$"$j$^$9$+e(B?

e$B$d$O$j!"e(BEncDet.opene$B$,$=$l$[$I$?$/$5$s;H$o$l$k$b$N$J$N$+$,$o$+e(B
e$B$j$^$;$s!#e(B

e$B:#$N$H$3$m!“6qBNNc$H$7$Fe(BRDoce$B$G$Ne(BRubye$B%9%/%j%W%H$NFI$9~$!”$He(B
e$B$$$&$N$,$G$F$$$^$9$,!"$=$l0J30$N>l9g$G;H$o$l$k$3$H$OB?$$$N$Ge(B
e$B$7$g$&$+!)$H$$$&$N$b!"%9%/%j%W%H$rFI$_9~$$3$H$O$=$s$J$K$J$$e(B e$B$N$G$O$J$$$+$H;W$C$F$$$k$+$i$G$9!#e(BPythone$B$de(BEmacse$B$GJT=8$9$k%U%!e(B e$B%$%k$Ge(Bmagic commente$B$r;H$C$F$$$k$N$O$o$+$k$N$G$9$,!"$=$l$i$Ne(B e$B%U%!%$%k$rFI$_9~$$3$H$,B?$$$N$+$,$o$+$j$^$;$s!#e(B

e$B%F%-%9%H$r=hM}$9$k!"$H$$$&$N$O=<J,$KB?$$$h$&$K;W$$$^$9!#e(B

e$B$?$H$($P!“e(BRD e$B$N%W%j%W%m%;%C%5$r=q$$$?$H$7$F!”%W%j%W%m%;%C%5e(B
e$B$,e(B RD e$B$G5-=R$5$l$?%F%-%9%H$rFI$`$H$-$K!“F|K\8l$r07$$$?$$$H$9e(B
e$B$l$P!”%(%s%3!<%G%#%s%0$r$I$&$K$+$9$kI,MW$,$"$j$^$9!#%F%-%9%He(B
e$B$re(B Emacs
e$B$GJT=8$9$k$H$9$l$P!":#2s$N$h$&$J%i%$%V%i%j$,$"$l$P!"e(B
e$B%(%G%#%?$H%W%j%W%m%;%C%5$G%(%s%3!<%G%#%s%0;XDj$r6&MQ$G$-$^$9!#e(B

RD e$B$K$+$.$i$:!"%W%l%$%s%F%-%9%H$K6a$$%U%)!<%^%C%H$G$"$l$P$Ie(B
e$B$l$bF1$8;v>p$,@.$jN)$D$G$7$g$&!#e(B

[email protected]_Dj%U%!%$%k$b$=$&$G$9!#:G6a$Oe(B YAML
e$B$,B?$$$h$&$J5$$,$7$^$9$,!“e(B
e$B<+A0$N%Q!<%6$r;}$C$F$$$k%”%W%j%1!<%7%g%s$b>/$J$/$O$J$$$G$7$ge(B
e$B$&!#@_Dj%U%!%$%k$NCf$KF|K\8l$rF~$l$?$$$H$9$l$P%(%s%3!<%G%#%se(B
e$B%0$r$I$&$K$+$7$J$1$l$P$J$i$:!":#2s$N$h$&$J%i%$%V%i%j$,Lr$KN)e(B
e$B$A$^$9!#e(B

e$B$^$?!“e(BCERN httpde$B7A<0$O$h$/;H$o$l$F$$$k$N$+!”$=$7$F$=$l$rMxMQe(B
e$B$7$?%U%!%$%k$rFI$_9~$`$3$H$OB?$$$N$+$H$$$&$N$b$o$+$j$^$;$s!#e(B

e$B$3$A$i$O$$$^$N$H$3$m$"$^$jIa5Z$7$F$$$k$H$O;W$$$^$;$s!#e(B

e$B$7$+$7!"$I$s$J%U%!%$%k$K$G$b%(%s%3!<%G%#%s%0$r$D$1$i$l$k$H$$e(B
e$B$&[email protected]<A$r;}$C$F$*$j!"$^$?!"%(%s%3!<%G%#%s%00J30$N>pJs$bF~e(B
e$B$l$i$l$k$?$a!"$$$m$$$m$HJXMx$J$s$8$c$J$$$+$H9M$($F$$$^$9!#e(B

e$B$=$&$$$&>lLL$,B?$$$N$G$"$l$PL>A0$rC;$/$7$?$$$H$$$&M_5a$O$o$+e(B
e$B$i$J$/$b$J$$$G$9!#[email protected]!";d$N7P83$G$O$=$s$J$K$J$$$s$8$c$J$$$+e(B
e$B$J$!$H$$$&46$8$G$9!#e(B

e$BIT;W5D$J$s$G$9$,!“F|K\8l$r4^[email protected]%F%-%9%H$r07$&$H$-!”$I$&$d$Ce(B
e$B$F%(%s%3!<%G%#%s%0$r=hCV$7$F$$$k$s$G$9$+e(B?

e$B$H!";W$C$Fe(B Rabbit e$B$Ne(B README.ja
e$B$r$$F$$k$H!“e(B–encoding e$B%%We(B
e$B%7%g%s$+<+F08!=P$N$h$&$G$9$M!#<+F08!=P$,$&$^$/$$$/$N$G$"$l$P!"e(B
e$BI,[email protected]$r46$8$J$$$N$+$J$!!#<+F08!=P$O$&$^$/$$$+$J$$$1$l$I!"Khe(B
e$B2se(B --encoding e$B%
%W%7%g%s$r;XDj$9$k$N$OLLE]!”$H$$$&$H$-$KLr$Ke(B
e$BN)$D$s$G$9$,!#e(B

EncDet.make_magic_comment(“euc-jp”) e$B$,e(B
“-- coding: euc-jp --” e$B$rJV$9$H$+!#e(B

e$B$&!<$s!";H$$$d$9$$$G$7$g$&$+!#e(B
e$B$b$7!":#8ee(BXMLe$B$r%5%]!<%H$7$?>l9g$O",$N7A<0$O;H$($^$;$s$h$M!#e(B
e$B8!=P$Oe(Bmagic commente$B0J30$b4hD%$k$1$I!"=PNO$Oe(Bmagic commente$B$N$_e(B
e$B%5%]!<%H$H$$$&$N$G$b$$$$$G$7$g$&$1$I!"=PNO$b%i%$%V%i%j$,$&$^e(B
e$B$$6q9g$K4hD%$C$F$[$7$$5$$,$7$^$9!#!J$d$k$J$i!Ke(B

EncDet.make_xml_decl e$B$b:n$k$3$H$O=PMh$^$9!#e(B

[email protected]!"$J$s$K$7$mF~NO$Oe(B magic comment e$B$G$be(B BOM
e$B$G$b$I$l$+$R$He(B
e$B$D$N7A<0$G8!=P$G$-$l$P$=$l$K$9$k$H$$$&$b$N$J$N$KBP$7!"=PNO$Oe(B
e$B$I$N7A<0$K$9$k$+%f!<%6$,;XDj$9$kI,MW$,$"$j$^$9!#$I$&4hD%$C$Fe(B
e$B$b!"7A<0$N>pJs$rDs6!$7$J$/$F$b$$$$$h$&$K$O$J$i$J$$$G$7$g$&$M!#e(B