복붙노트

[RUBY-ON-RAILS] 레일 v3의 문자 인코딩 문제 / 루비 1.9.2

RUBY-ON-RAILS

레일 v3의 문자 인코딩 문제 / 루비 1.9.2

내가 파일에서 내용을 읽을 때 나는 "UTF-8로 잘못된 바이트 시퀀스"이 오류 가끔를 얻을. 주 - 문자열의 일부 특수 문자가있는 경우에만 발생합니다. 나는없이 파일을 여는 시도했다 "R : UTF-8",하지만 여전히 같은 오류가 발생합니다.

open(file, "r:UTF-8").each_line { |line| puts line.strip(",") } # line.strip generates the error

파일의 내용 :

# encoding: UTF-8
290919,"SE","26","Sk‰l","",59.4500,17.9500,, # this errors out
290956,"CZ","45","HornÌ Bradlo","",49.8000,15.7500,, # this errors out
290958,"NO","02","Svaland","",58.4000,8.0500,, # this works

이것은 내가 외부에서받은 CSV 파일 만 내 DB로 가져, 그것은 "# 인코딩 : UTF-8"와 함께 제공되지 않은 시도하고 상단에,하지만 어딘가에는이 문제가 해결됩니다 읽을 수 있기 때문에 나는이 추가 하지만하지 않았다. :(

환경:

해결법

  1. ==============================

    1.루비 각 파일에 대한 외부 및 내부 인코딩 부호화의 개념을 갖는다. 이 파일이 더 난해한 형식으로 저장하는 경우에도, 당신은 당신의 소스에서 UTF-8의 파일로 작업 할 수 있습니다. 기본 외부 인코딩이 UTF-8 (당신이 맥 OS X에 있다면 그것은이다) 인 경우, 파일 I의 모든 / O는 물론 UTF-8로 될 것입니다. 이 사용 File.open ( '파일'). external_encoding를 확인할 수 있습니다. 당신이 당신의 파일을 열고 통과 할 때 당신이하고있는 "R : UTF-8은"루비는 기본적으로 사용하고있는 동일한 외부 인코딩을 강제한다.

    루비 각 파일에 대한 외부 및 내부 인코딩 부호화의 개념을 갖는다. 이 파일이 더 난해한 형식으로 저장하는 경우에도, 당신은 당신의 소스에서 UTF-8의 파일로 작업 할 수 있습니다. 기본 외부 인코딩이 UTF-8 (당신이 맥 OS X에 있다면 그것은이다) 인 경우, 파일 I의 모든 / O는 물론 UTF-8로 될 것입니다. 이 사용 File.open ( '파일'). external_encoding를 확인할 수 있습니다. 당신이 당신의 파일을 열고 통과 할 때 당신이하고있는 "R : UTF-8은"루비는 기본적으로 사용하고있는 동일한 외부 인코딩을 강제한다.

    기회는 소스 문서가 UTF-8에없는 그 비 ASCII 문자 (그들이 있다면, 당신도 올바른 문자없이 오류를 얻을 것, 그리고 그들이 잘못에 의해 매핑 한 경우 UTF-8로 깔끔하게 매핑되지 않습니다이다 , 당신은) 잘못된 문자가없고 오류가 발생합니다. 당신이해야 할 것은 다음과 같이 읽기에 루비 트랜스에게 문서가 원본 문서의 인코딩을 결정하려고 할 것입니다 :

    File.open(file, "r:windows-1251:utf-8").each_line { |line| puts line.strip(",") }
    

    당신이 소스의 인코딩을 결정하는 데 도움이 필요하면이 파이썬 라이브러리에게 소용돌이를 제공합니다. 그것은 시몽 / 모질라에 있었다 (그리고 파이어 폭스에서 가능성이 여전히) 자동 캐릭터 감지 대체 기반으로.

  2. ==============================

    2.당신이 당신의 파일 인코딩을 변경하려는 경우, 당신은 보석 '겨자과의 잡초 홈즈'를 사용할 수 있습니다

    당신이 당신의 파일 인코딩을 변경하려는 경우, 당신은 보석 '겨자과의 잡초 홈즈'를 사용할 수 있습니다

    $require 'charlock_holmes/string'
    content = File.read('test2.txt')
    if !content.is_utf8?
      detection = CharlockHolmes::EncodingDetector.detect(content)
      utf8_encoded_content = CharlockHolmes::Converter.convert content, detection[:encoding], 'UTF-8'
    end
    

    그런 다음 임시 파일에 새 내용을 저장하고 원본 파일을 덮어 쓸 수 있습니다. 이 도움을 바랍니다.

  3. from https://stackoverflow.com/questions/4697413/character-encoding-issue-in-rails-v3-ruby-1-9-2 by cc-by-sa and MIT license