복붙노트

[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. ==============================

    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. ==============================

    2.UTF-8로 다시 \ Uxxxx에 코드를 설정하려면 :

    UTF-8로 다시 \ Uxxxx에 코드를 설정하려면 :

    json_string.gsub!(/\\u([0-9a-z]{4})/) {|s| [$1.to_i(16)].pack("U")}
    
  3. ==============================

    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. ==============================

    4.나는 다음을 사용하므로 문자는 Rails2.3.11 / Ruby1.8에서 다른 방법으로 유니 코드로 탈출되지 않은 :

    나는 다음을 사용하므로 문자는 Rails2.3.11 / Ruby1.8에서 다른 방법으로 유니 코드로 탈출되지 않은 :

    render :json => JSON::dump(obj)
    
  5. ==============================

    5.즉, 올바른 부호화된다. JSON 이스케이프하지 requre 유니 코드 문자를 않지만, 운송 잠재적 인코딩 문제를 방지하기 위해, 단지 7 비트 ASCII 문자가 포함되어 생산 출력 JSON 라이브러리 일반적입니다.

    즉, 올바른 부호화된다. JSON 이스케이프하지 requre 유니 코드 문자를 않지만, 운송 잠재적 인코딩 문제를 방지하기 위해, 단지 7 비트 ASCII 문자가 포함되어 생산 출력 JSON 라이브러리 일반적입니다.

    모든 JSON 인터프리터는 해당 문자열을 소비하고 원본을 재현 할 수있을 것입니다. 브라우저의 주소 표시 줄에 경고 ( "확인 \ u00e9") : 행동이를 보려면, 단지 자바 스크립트를 입력합니다.

  6. ==============================

    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. ==============================

    7.나는이 문제를 해결하기 매우 까다로운 방법을 가지고있다. to_json 당신이 올바른 코드를 허용하지 않은 경우 글쎄, 당신은 직접 작성을 시도 할 수 있습니다 :

    나는이 문제를 해결하기 매우 까다로운 방법을 가지고있다. to_json 당신이 올바른 코드를 허용하지 않은 경우 글쎄, 당신은 직접 작성을 시도 할 수 있습니다 :

    render text: tags
    

    태그 또는 JSON 렌더링 : JSON 렌더링 텍스트 렌더링 사용하는 경우 tags.to_json 항상 자동 전송 인코딩 스타일,하지만 것입니다 : 태그를 그대로, 다음 문자열은 유지됩니다. 그리고 jQuery를 여전히 데이터를 인식 할 수 생각합니다.

  8. from https://stackoverflow.com/questions/5123993/json-encoding-wrongly-escaped-rails-3-ruby-1-9-2 by cc-by-sa and MIT license