티스토리 뷰

text file을 line별 parsing을 하고 split 하려던 중, 오류 발생.
-> ruby invalid byte sequence in utf 8
-> ruby도 encoding 문제에서 자유롭지 못함.
-> 사실 이건 모든 프로그래밍 언어의 문제...정확히는 윈도우와의 호환에서 생기는 문제.
-> 해당 문자열에 force_encoding("iso-8859-1").encoding("UTF-8")을 하니 처리 되기 시작.
-> 헌데, 읽혀진 문자열에 유효하지 않은 공백이 포함됨.

text 파일이 ANSI, utf-8은 정상적으로 읽힘. 헌데, unicode option의 text file만 안읽힘. (notepad encoding option중 utf-8, ANSI는 정상적이고, unicode에서만 문제가 생김)
-> 각종 encoding option 으로 해결 안됨.
-> line 별 encoding 을 시도.
-> 첫번째 라인만 encoding 됨. 두번째 라인부터 꼬임.
-> line별 encoding을 확인해보았더니, 두번째 라인부터는 CP949 (ascii code page 949)로 인식되는 것을 확인.
-> C++에서 binary로 읽어 메모리값 확인해보니 처음 2byte가 254,255로 들어가 있었음. 이 값이 인코딩 방식에 대한 기록 값이었던 것.
-> 파일 전체를 열고 버퍼 전체를 인코딩 해보았더니 정상적으로 읽힘.
-> 해결!


정리하자면,
IO.foreach('file.rb') do | line |
    line.encode!("UTF-8", "UTF-16le", :invalid => :replace, :undefined => :replace, replace: "")
end



위와같이 변환시에는 첫 라인만 제대로 변환되고 두번째 라인부터는 값이 망가지더군요.


그래서, 

lines = Array.new
fSize = aFile.stat.size
if aFile
	content = aFile.sysread(fSize)
	content.encode!("UTF-8", "UTF-16le", :invalid => :replace, :undefined => :replace, replace: "")
	lines = content.split(/(\n)/)
else
	puts 'Unable open file'
end




위와같이 파일에서 읽은 내용 전체를 한번에 변환시 잘 처리 되었습니다.


stackoverflow의 관련 글

http://stackoverflow.com/questions/14035307/ruby-invalid-byte-sequence-in-utf-8-argumenterror

http://stackoverflow.com/questions/11065962/ruby-split-invalid-byte-sequence-in-utf-8-argumenterror

http://stackoverflow.com/questions/24036821/ruby-2-0-0-stringmatch-argumenterror-invalid-byte-sequence-in-utf-8

'Scripts > Ruby' 카테고리의 다른 글

Welcome to ruby!  (0) 2014.11.04
루비에서 쉘 명령을 내리는 방법  (0) 2014.06.03
루비 주석  (0) 2014.02.07
루비 변수 관련 정리  (0) 2013.05.14
Ruby가 모듈을 찾는 장소.  (0) 2013.05.09
댓글