2012-09-10 6 views
1

레일즈 애플리케이션에서 사용하기 위해 Postgres로 가져온 데이터가 있습니다. 그러나 어떻게 든 외국 악센트가 이상하게 인코딩되었다 :이상한 문자 인코딩 문제

  • äâ§
  • á
  • éâ©
  • ó가 난

ââ¥로 나타납니다로 나타납니다 â°로 나타납니다으로 나타납니다 꽤 문제가 int와 함께 꽤있다. Rails의 문제보다는 데이터의 조잡함. 내가하려고 어떤 인코딩과 일치하지 않는 것 :

# Replace "cp1252" with any other encoding, to no effect 
"Trollâ§ttan".encode("cp1252").force_encoding("UTF-8") #-> junk 

사람, 즉 좋은 것 내가 앓고있어 인코딩 호환 문제의 종류를 식별 할 수 있었다면.

최후의 수단으로 각 악센트 부호가있는 악센트 문자를 수동으로 바꾸어야 할 수도 있지만 누구든지 프로그래밍 방식의 해결책을 제안 할 수 있다면 (또는이를 고치는 시작점조차도 - 디버깅하기가 매우 어려웠 음) 나는 감사 할 줄 알았다.

+0

데이터베이스에서 사용하는 인코딩을 확인할 수 있습니까? 또한 정확히 어떻게 데이터를 가져 왔습니까? – PinnyM

+0

인코딩은 'UTF8'(데이터 정렬'en_US.UTF-8')입니다. 데이터는 상당히 복잡한 가져 오기 프로세스 (원래 CSV, Google Refine을 거쳐 더 많은 변환이 이루어짐)를 거쳤습니다. 데이터를 다시 가져 오는 것이 그리 쉽지는 않을 것이므로 내부 수정이 이상적입니다. –

+0

원본 CSV 파일 - 인코딩은 무엇입니까?'복잡한 가져 오기 프로세스'는 많은 변수를 추가하며, 이로 인해 여러 인코딩이 잘못 해석 될 수 있습니다 ... 또한 프로세스의 각 간격에서 인코딩을 확인할 수 있으면 소스를 고정하는 데 도움이 될 수 있습니다 부패 문제가 상당히 – PinnyM

답변

2

최근 버전의 PostgreSQL에서는 UTF8 데이터베이스 내에서 유효하지 않은 UTF8을 가질 가능성이 거의 없습니다. 그러나 그 결과로 이어질 수있는 다른 그럴듯한 가능성이 있습니다. ©로 나타나는 é의 전형적인 경우

어느 : 데이터베이스

  1. 내용이 적용되어, 그들이 이소 것처럼 몇몇 클라이언트 측 층은 데이터베이스로부터 바이트를 해석한다 latin-something 인 반면 UTF8입니다.

  2. 내용이 유효하고 SQL 클라이언트 측 계층은 유효하지만이 터미널/소프트웨어/웹 페이지는 iso-latin1 또는 유사한 모노 바이트 인코딩 (win1252, iso-latin9 ...).

  3. 데이터베이스의 내용은 유효한 UTF8 인코딩의 잘못된 문자로 구성됩니다. 이것은 iso-latin-something 바이트를 가져 와서 UTF8 표현으로 변환 한 다음 결과 바이트 스트림을 iso-latin에있는 것처럼 가져 와서 다시 UTF8로 변환하고 삽입하면 끝납니다 데이터베이스에 저장합니다. © 순서가 이소 - 라틴어 혼란 대 UTF8 전형적인 동안, 모든 샘플 문자열의 추가 â의 존재가 드문 것을

참고. 그것은 주요 오판의 위에 다른 오해의 결과일지도 모른다. 3 번에 해당하는 경우 검색 교체를 기반으로 한 자동 수정이 이미 까다로운 일반 사례보다 어려울 수 있습니다.