2014-07-19 2 views
2

Windows 컴퓨터에 다소 큰 JSON 파일이 있으며 \xE9과 같은 내용이 포함되어 있습니다. 내가 JSON.parse 일 때 잘 동작합니다. 나는에 CentOS를 실행 내 서버에 코드를 누르면JSON.parse를 사용하여 예기치 않은 인코딩 오류가 발생했습니다.

하지만, 난 항상이 얻을 :

λ file data.json 
data.json: UTF-8 Unicode English text, with very long lines, with no line terminators 

CentOS는 : 여기

"\xE9" on US-ASCII (Encoding::InvalidByteSequenceError)

윈도우 두 시스템에 file의 출력 :

$ file data.json 
data.json: UTF-8 Unicode English text, with very long lines, with no line terminators 

여기에서 i 내가 구문 분석하려고 할 때 오류가 발생했습니다.

$ ruby -rjson -e 'JSON.parse(File.read("data.json"))' 
/usr/local/rvm/rubies/ruby-2.0.0-p353/lib/ruby/2.0.0/json/common.rb:155:in `encode': "\xC3" on US-ASCII (Encoding::InvalidByteSequenceError) 

이 문제의 원인은 무엇입니까? 가능한 모든 가능한 인코딩으로 파일을 변경하려면 iconv 사용하여 시도했지만 아무 것도 작동하는 것.

답변

8

"\xE9"은 ISO-8859-1 (및 기타 다양한 ISO-8859-X 인코딩 및 Windows-1250 등)에서 é이며 확실히 UTF-8이 아닙니다.

당신은 encoding options를 사용하여 당신을 위해 인코딩을 해결하기 위해 File.read를 얻을 수 있습니다 : 당신이 JSON.parse에 손으로 할 수있는 UTF-8 인코딩 된 문자열을 줄 것이다

File.read('data.json', 
    :external_encoding => 'iso-8859-1', 
    :internal_encoding => 'utf-8' 
) 

합니다.

또는 문자열이 올바른 인코딩 플래그를 사용하여 디스크의 제공 확인하기 위해 단지 :external_encoding을 사용하여 인코딩 JSON.parse 거래를 할 수 있습니다 :

JSON.parse(
    File.read('data.json', 
    :external_encoding => 'iso-8859-1', 
) 
) 

당신은 알아 내기 위해 data.json 면밀한 관찰을해야한다 왜 파일 (1)라고 생각하는 이유는 UTF-8입니다. UTF-8이 아니거나 누군가 UTF-8 및 Latin-1 인코딩 된 문자열을 하나의 파일에 혼합하는 경우 파일에 잘못 BOM이있을 수 있습니다.

+0

문제는 내가 소유 한 파일입니다. 이 문제를 직접 해결하기 위해 파일의 인코딩을 사용하는 것이 가능합니까 아니면 Ruby에서해야합니까? 답변을 읽은 후에 파일을 ISO-8859-1로 변환하려고했지만 여전히 인식하지 못합니다. – itdoesntwork

+0

파일은 이미 ISO-8859-1입니다. 당신은 그것을 Ruby로 읽어 들여 인코딩을 UTF-8 (첫 번째'File.read' 예제 에서처럼)로 변환 한 다음 다시 출력 할 수 있습니다. 그러면 UTF-8로 인코딩 된 파일이 남습니다. –

관련 문제