2015-01-31 1 views
0

Nokogiri gem으로 일부 HTML 스크래핑 및 구문 분석을 수행하는 Ruby 스크립트에 문자 인코딩 문제가 있습니다. 내가 Café이 문자열의 일부 게재 볼 수있는, 내 로그에서스크랩 한 HTML의 Ruby 문자 인코딩 문제

./script.rb:333:in `join': incompatible character encodings: UTF-8 and ASCII-8BIT (Encoding::CompatibilityError) 

: 스크립트의 한 시점에서,이 오류가 발생합니다 일부 HTML에서 가져온 된 문자열 배열에 join("\n") 전화 조인 작업에 포함됩니다.

내 배열의 일부 문자열은 ASCII-8BIT이고 일부는 UTF-8이고 루비는 결합 할 수 없습니까? Nokogiri로 구문 분석 한 후 (UTF-8로) 내 문자열을 변환하거나 살균해야합니까?

긁힌 HTML 콘텐츠에 대해 force_encoding('UTF-8')encode('UTF-8')을 시도했지만 다른 것을하기 전에 시도했지만 도움이되지 않았습니다. 사실 encode('UTF-8')을 시도한 후 Café이 포함 된 문자열에 to_s을 호출했을 때 스크립트가 더 일찍 추락했습니다.

문자 인코딩은 항상 나를 혼란스럽게합니다. 이 오류를 피하기 위해 문자열을 살균 할 수있는 다른 방법이 있습니까?

편집 : 내가 최근 펄에서 비슷한 일을하고 Text::Unidecode라는 모듈을 사용하고 문제가 문자를 예를 들어, 변환 함수에 내 문자열을 통과 할 수 있었다되었다
문자 a은 일반 문자 a에 예리합니다. 루비와 비슷한 점이 있나요? (이것은 내가 급성으로는 A를 유지할 수 있을지는하지만 목표로하고있어 그 내가 생각하는 것이 무엇 필요는 없다

Edit2가 :.
난 정말이 혼란스러워하고있어 어려운 증명하는 것 안정적으로 재현하는 몇 가지 코드입니다 :.

[CODE REMOVED] 

EDIT3는 :
이 정확하지 않았기 때문에 나는 이전에 게시 된 코드 예제를 제거하지만 인쇄하거나를 호출 할 때마다 결론이다.긁힌 문자열에서 인코딩 오류가 발생합니다.

Edit4는 :
그것은 긁어 HTML 입력이 문제를 일으키는 무슨 아니었다 결국 밝혀졌다. 인쇄 할 때마다 인코딩 오류가 발생하거나 해시 된 텍스트를 포함하는 해시를 to_s로 호출 할 때마다 인코딩 오류가 발생합니다. '다른 것'은 데이터베이스 쿼리의 값이었고 ASCII-8BIT에 반환되었습니다. 이 문제를 해결하기 위해 필자는 사용하는 각 데이터베이스 값에 force_encoding('UTF-8')을 명시 적으로 호출해야했습니다 (비록 mysql2 보석이 자동으로이 작업을 수행하므로 전환해야 함).

나는 문자 인코딩이 싫다.

+0

웹 페이지에 따르면, charset은 UTF-8입니다. 나는'resp = Net :: HTTP.get_response (uri)'와'Nokogiri :: HTML.parse (resp.body)'와 같은 페이지를 가져오고/읽는 중이다. – RTF

+0

이것들 중 하나 (또는 ​​둘 모두)를 특정 문자 인코딩을 사용하고 싶습니까? – RTF

+0

"편집 ..."이라고 계속 말하는 것은 필요하지 않으며 바람직합니다. 필요한 경우 편집 한 내용을 볼 수 있습니다. 대신, 질문의 텍스트 흐름에 추가하는 내용이 의미가 있는지 확인하십시오. 자신이하는 일에 대해 설명하는 대신 최소한의 샘플 입력과 함께 문제를 설명하는 데 필요한 최소한의 코드를 제공하십시오. 설명하려고하는 것은 몇 줄의 코드와 거의 비슷하지 않습니다. –

답변

2

CaféCafé으로 가정한다.UTF-8에서 Café으로 시작하지만 바이트를 ISO-8859-1 (일명 라틴어 -1)로 인코딩 한 다음 UTF-8로 다시 인코딩 한 것처럼 처리하면 Café이됩니다. 봄; 예를 들면 :

> s = 'Café' 
=> "Café" 
> s.encoding 
=> #<Encoding:UTF-8> 
> s.force_encoding('iso-8859-1').encode('utf-8') 
=> "Café" 

그래서 어딘가에 당신은 UTF-8 문자열을 읽고 있지만, 라틴 -1과 UTF-8로 재 인코딩으로 치료. Nokogiri가 페이지를 읽고 Latin-1이라고 생각하거나 사용자 에이전트가 Latin-1 텍스트를 가져오고 있다고 생각하는 것 같습니다. 어딘가에 나쁜 기본 인코딩이 있거나 HTTP 헤더가 인코딩에 대해 거짓이거나 페이지 자체가 인코딩에 대해 거짓말을하고있는 것일 수 있습니다.

스크래퍼 가장자리에서 모든 것을 UTF-8로 가져와야합니다. 인코딩에 대해 누가 거짓말을하는지 파악하고 바로 정렬하십시오.

혼란, 어리 석음, 어림짐작 및 강세의 악몽 인 스크래핑 및 인코딩은 기분이 좋지 않습니다. 서버 거짓말, 페이지 거짓말, 브라우저 거짓말, 아무도 행복하지 않습니다.

+0

쿨, 고마움 - 내 질문을 업데이트했습니다 – RTF

+0

당신은 기술적으로 정확했습니다. – RTF