2017-10-27 10 views
0

내 Rails 앱에서 this SO post에 언급 된 솔루션을 기반으로 Postgres에서 직접 큰 CSV 파일을 스트리밍 할 수있었습니다. 내 작업 코드는과 같이 다소 같습니다 Postgresql의 copy_data 함수를 사용할 때 문자 인코딩을 올바르게 처리하는 방법은 무엇입니까?

query = <A Long SQL Query String> 
response.headers["Cache-Control"] = "no-cache" 
response.headers["Content-Type"] = "text/csv; charset=utf-8" 
response.headers["Content-Disposition"] = 
    %(attachment; filename="#{csv_filename}") 
response.headers["Last-Modified"] = Time.now.ctime.to_s 
conn = ActiveRecord::Base.connection.raw_connection 

conn.copy_data("COPY (#{query}) TO STDOUT WITH (FORMAT CSV, HEADER TRUE, FORCE_QUOTE *, ESCAPE E'\\\\');") do 
    while row = conn.get_copy_data 
     response.stream.write row 
    end 
    end 
    response.stream.close 
end 

열 (VARCHAR)의 일부

영어, 중국어 문자열 중 하나와 같은 값이 조회되는. 위 코드로 인해 생성 된 CSV 파일에는 중국어가 그대로 표시되지 않습니다. 대신,이 같은 것을 얻을 :

大大 æ-가 æ- 나는 내가 copy_data 기능을 사용하고 방식을 변경하기로, 또는

입니다 있습니까 ‡ ‡이 이 문제를 해결하기 위해 CSV 파일에 할 수있는 것이 있습니까? 파일을 UTF-8 .txt 파일로 저장하려고 시도했을뿐만 아니라 copy_data 설명서에 언급 된 convert_to 함수를 시도했지만 아무 소용이 없습니다.

답변

0

이것은 CSV 파일에 포함 된 원본 인코딩에 따라 다릅니다.

리눅스에서이 작업을 수행 :

file -i you_file 

당신은 확신이 아니에요 UTF-16 또는 GB 18030? 또한 어떤 종류의 인코딩이 데이터베이스에 설치되어 있습니까?

이것을 보려면 psql에서 \ l을 수행하십시오.

+0

@ Hervé Piedvache 도와 주셔서 감사합니다. 주어진 문제를 해결하는 해답을 추가했습니다. –

0

그래서 내 MS Excel에서 중국어 문자를 올바르게 렌더링 할 수없는 것으로 나타났습니다. MacOS에서 Numbers 응용 프로그램 (또는 심지어 Atom)을 사용하여 동일한 .csv 파일을 열면이 문제가 해결되었습니다.