[RUBY-ON-RAILS] 잘못 JSON (1.9.2 루비 레일 3) 부호화하는 탈출
RUBY-ON-RAILS잘못 JSON (1.9.2 루비 레일 3) 부호화하는 탈출
내 컨트롤러에서 다음 작업 (인쇄 "OKE")
puts obj.inspect
그러나 이것은 ( "확인 \ u00e9을"렌더링)하지 않습니다
render :json => obj
분명히 to_json 방법은 유니 코드 문자를 이스케이프합니다. 이 문제를 방지 할 수있는 옵션이 있습니까?
해결법
-
==============================
1.당신이 소스를 통해 발굴하면 결국 ActiveSupport :: JSON :: 인코딩 및 탈출 방법에 올 수 있습니다 :
당신이 소스를 통해 발굴하면 결국 ActiveSupport :: JSON :: 인코딩 및 탈출 방법에 올 수 있습니다 :
def escape(string) if string.respond_to?(:force_encoding) string = string.encode(::Encoding::UTF_8, :undef => :replace).force_encoding(::Encoding::BINARY) end json = string. gsub(escape_regex) { |s| ESCAPED_CHARS[s] }. gsub(/([\xC0-\xDF][\x80-\xBF]| [\xE0-\xEF][\x80-\xBF]{2}| [\xF0-\xF7][\x80-\xBF]{3})+/nx) { |s| s.unpack("U*").pack("n*").unpack("H*")[0].gsub(/.{4}/n, '\\\\u\&') } json = %("#{json}") json.force_encoding(::Encoding::UTF_8) if json.respond_to?(:force_encoding) json end
다양한 GSUB 통화 ASCII가 아닌 UTF-8 \ Uxxxx에 표기 당신이있는 거 보는을 강요하고 있습니다. 진수 인코딩 UTF-8은 JSON을 처리하는 것을 수용 할 수 있어야하지만, 필요하다면 당신은 항상 사후 처리는 JSON (또는 수정 된 JSON 탈옥수 원숭이 패치) 원료 UTF-8로 \ Uxxxx에 표기를 변환 할 수 있습니다.
내가 JSON을 강제하는 7 비트 깨끗한 비트 가짜 인 것으로 동의 거라고하지만 당신은 거기 가서.
짧은 답변 : 아니오.
-
==============================
2.UTF-8로 다시 \ Uxxxx에 코드를 설정하려면 :
UTF-8로 다시 \ Uxxxx에 코드를 설정하려면 :
json_string.gsub!(/\\u([0-9a-z]{4})/) {|s| [$1.to_i(16)].pack("U")}
-
==============================
3.당신은 MUU 언급 된 방법이 너무 짧은 패치 원숭이하여 방지 할 수 있습니다. 에 다음을 넣어 설정 / 초기화 / patches.rb (또는 이와 유사한 물건을 패치에 사용되는 파일)과 레일이 변경 사항을 적용하려면 처리 다시 시작합니다.
당신은 MUU 언급 된 방법이 너무 짧은 패치 원숭이하여 방지 할 수 있습니다. 에 다음을 넣어 설정 / 초기화 / patches.rb (또는 이와 유사한 물건을 패치에 사용되는 파일)과 레일이 변경 사항을 적용하려면 처리 다시 시작합니다.
module ActiveSupport::JSON::Encoding class << self def escape(string) if string.respond_to?(:force_encoding) string = string.encode(::Encoding::UTF_8, :undef => :replace).force_encoding(::Encoding::BINARY) end json = string.gsub(escape_regex) { |s| ESCAPED_CHARS[s] } json = %("#{json}") json.force_encoding(::Encoding::UTF_8) if json.respond_to?(:force_encoding) json end end end
패치가 ActiveSupport의 미래 버전과 함께 작동한다는 보장이 없다는 것을 adviced합니다. 이 게시물을 작성할 때 사용되는 버전은 3.1.3이다.
-
==============================
4.나는 다음을 사용하므로 문자는 Rails2.3.11 / Ruby1.8에서 다른 방법으로 유니 코드로 탈출되지 않은 :
나는 다음을 사용하므로 문자는 Rails2.3.11 / Ruby1.8에서 다른 방법으로 유니 코드로 탈출되지 않은 :
render :json => JSON::dump(obj)
-
==============================
5.즉, 올바른 부호화된다. JSON 이스케이프하지 requre 유니 코드 문자를 않지만, 운송 잠재적 인코딩 문제를 방지하기 위해, 단지 7 비트 ASCII 문자가 포함되어 생산 출력 JSON 라이브러리 일반적입니다.
즉, 올바른 부호화된다. JSON 이스케이프하지 requre 유니 코드 문자를 않지만, 운송 잠재적 인코딩 문제를 방지하기 위해, 단지 7 비트 ASCII 문자가 포함되어 생산 출력 JSON 라이브러리 일반적입니다.
모든 JSON 인터프리터는 해당 문자열을 소비하고 원본을 재현 할 수있을 것입니다. 브라우저의 주소 표시 줄에 경고 ( "확인 \ u00e9") : 행동이를 보려면, 단지 자바 스크립트를 입력합니다.
-
==============================
6.렌더링 :이 문자열이 아니라면 JSON은 개체에 .to_json 호출합니다. 당신은 수행하여이 문제를 방지 할 수 있습니다 :
렌더링 :이 문자열이 아니라면 JSON은 개체에 .to_json 호출합니다. 당신은 수행하여이 문제를 방지 할 수 있습니다 :
render :json => JSON.generate(obj)
이것은 직접 문자열을 전달하기 때문에 ActiveSupport의 to_json에 대한 호출을 방지 할 수 있습니다.
또 다른 방법은 그래서이 경우에, 당신은 같은 것을 할 수있는, 당신이 직렬화 된 객체에 to_json 무시하는 것입니다 :
class Foo < ActiveRecord::Base def to_json(options = {}) JSON.generate(as_json) end end
당신이 ActiveModelSerializers를 사용하는 경우, 당신은 당신의 시리얼에 to_json 대체하여이 문제를 해결할 수 있습니다 :
# controller respond_with foo, :serializer => MySerializer # serializer attributes :bar, :baz def to_json(options = {}) JSON.generate(serializable_hash) end
-
==============================
7.나는이 문제를 해결하기 매우 까다로운 방법을 가지고있다. to_json 당신이 올바른 코드를 허용하지 않은 경우 글쎄, 당신은 직접 작성을 시도 할 수 있습니다 :
나는이 문제를 해결하기 매우 까다로운 방법을 가지고있다. to_json 당신이 올바른 코드를 허용하지 않은 경우 글쎄, 당신은 직접 작성을 시도 할 수 있습니다 :
render text: tags
태그 또는 JSON 렌더링 : JSON 렌더링 텍스트 렌더링 사용하는 경우 tags.to_json 항상 자동 전송 인코딩 스타일,하지만 것입니다 : 태그를 그대로, 다음 문자열은 유지됩니다. 그리고 jQuery를 여전히 데이터를 인식 할 수 생각합니다.
from https://stackoverflow.com/questions/5123993/json-encoding-wrongly-escaped-rails-3-ruby-1-9-2 by cc-by-sa and MIT license
'RUBY-ON-RAILS' 카테고리의 다른 글
[RUBY-ON-RAILS] 로거 형식 문자열 구성을 레일 (0) | 2020.02.25 |
---|---|
[RUBY-ON-RAILS] 루비 1.9.3 사용하는 경우에는 OpenSSL 오류 "인증 실패를 확인" (0) | 2020.02.25 |
[RUBY-ON-RAILS] 어떻게 비디오에서 방향 정보를 추출하는? (0) | 2020.02.25 |
[RUBY-ON-RAILS] "보석 레일을 설치는"DNS 오류로 실패 (0) | 2020.02.25 |
[RUBY-ON-RAILS] 어떻게 레일 편집 필드에 표시된 값을 포맷 할 수 있습니다? (0) | 2020.02.25 |