Ruby에서 HTML 엔터티를 어떻게 인코딩 / 디코딩합니까?


200

나는 다음과 같은 몇 가지 HTML 엔티티 디코딩하려고 '&amp;lt;'되고를 '<'.

오래된 보석 ( html_helpers )이 있지만 두 번 버려진 것으로 보입니다.

어떤 추천? 모델에서 사용해야합니다.


6
그냥 발견 '를 htmlentities'( htmlentities.rubyforge.org )
— 코스타스

여러 사이트에서 HTML을 가져 와서 데이터베이스에 일반 텍스트로 저장해야한다고 지정해야합니다.
— Kostas

1
대부분의 투표는 CGI를 사용했지만 그렇습니다. 이는 하나의 방법으로 모든 활성 지원을 끌어 오는 것과 같습니다. 대신 선택한 답변에 언급 된대로 HTMLEntities를 사용하십시오.
— Tin Man

답변:


153

HTMLEntities 는 다음을 수행 할 수 있습니다.

: jmglov@laurana; sudo gem install htmlentities
Successfully installed htmlentities-4.2.4
: jmglov@laurana;  irb
irb(main):001:0> require 'htmlentities'
=> []
irb(main):002:0> HTMLEntities.new.decode "&iexcl;I&#39;m highly&nbsp;annoyed with character references!"
=> "¡I'm highly annoyed with character references!"

Zdrasti Ivailo. 귀하의 의견에 감사드립니다. Ruby에서 XML 문자 엔티티 참조 를 어떻게 렌더링 할 수 있습니까?에 대한 내 문제를 해결했습니다 . 게다가!
— Josh Glover

4
그래의 HTMLEntities보석 같은 경우 취급 &aring;하고 &mdash;있는 CGI.unescapeHTML하지 않습니다.
— thomax

295

문자를 인코딩하려면 다음을 사용할 수 있습니다 CGI.escapeHTML.

string = CGI.escapeHTML('test "escaping" <characters>')

그것들을 해독하기 위해 CGI.unescapeHTML:

CGI.unescapeHTML("test &quot;unescaping&quot; &lt;characters&gt;")

물론 그 전에 CGI 라이브러리를 포함시켜야합니다.

require 'cgi'

Rails에 있다면 문자열을 인코딩하기 위해 CGI를 사용할 필요가 없습니다. 있다 h방법.

<%= h 'escaping <html>' %>

9
이 방법을 먼저 시도했지만 "& nbsp;" ""로 여러 사이트에서 HTML을 가져 와서 데이터베이스에 일반 텍스트로 저장해야한다고 지정해야한다고 생각합니다.
— 코스타스

2
데이터베이스에서 저장을 위해 HTML 엔티티를 일반 텍스트로 디코딩하는 경우 데이터베이스가 잘못된 문자에 대해 많은 불만을 제기 할 것으로 예상하십시오. 인코딩 된 엔터티는 일반 텍스트로 전송할 수 있도록 인코딩됩니다. 그것들을 디코딩하면 아마도 AKA 바이너리 인 상위 비트 세트 문자로 되돌릴 수 있습니다. 거의 일반 텍스트를 기대하는 DB를 실제로 자극하는 멀티 바이트 문자로 끝날 수 있습니다. 아무것도 변하지 않을 때까지 디코딩을 한 다음 한 번 인코딩하여 모든 것이 정규화되어 저장되는 것이 좋습니다.
— Tin Man

1
여러 번 인코딩 된 엔터티에 많은 HTML이 발생하여 실제로 엉망이되었습니다. 수세미를 확인하십시오 . 스크러버는 내가 올바르게 기억한다면 이것을 위해 설계되었습니다.
— Tin Man

3
우리는 데이터베이스가 유니 코드를 저장하도록 설정 했으므로 전혀 불평하지 않을 것입니다. 그리고 loofah는 내가 찾고있는 것이 아니며, html 태그를 제거하고 싶지 않습니다.
— Kostas

1
2015 년에도 unescapeHTML은 여전히 ​​Acute
— nurettin

47

노코 기리 보석 도 좋은 선택 이라고 생각 합니다. 매우 안정적이며 커뮤니티에 큰 기여를하고 있습니다.

샘플:

a = Nokogiri::HTML.parse "foo&nbsp;b&auml;r"    
a.text 
=> "foo bär"

또는

a = Nokogiri::HTML.parse "&iexcl;I&#39;m highly&nbsp;annoyed with character references!"
a.text
=> "¡I'm highly annoyed with character references!"

3
@theTinMan, 예, 그것은 수요에 달려 있다고 생각합니다. 이 주제의 토론을 통해 알 수 있듯이 CGI.escapeHTML일부 경우를 해결할 수 없습니다. 반면에 전폭적 인 지원이 필요하다면 Nokogiri좋은 선택이라고 확신 합니다.
— Hoang Le

6
또한 일부 HTML 구문 분석에 이미 Nokogiri를 사용하고 있다면 해당 목적으로 만 다른 gem을 설치하는 것은 부당합니다. 예를 들어, HTML 정리를 위해 Sanitize gem을 사용하고 있습니다. 이 보석이 후드 아래에서 노코 기리를 사용하고 있음을 알 수 있으므로 그 일을하지 않는 것은 부끄러운 일입니다. 팁 주셔서 감사합니다 @HoangLe!
— Tomalla

1
참고 : CGI::escapeHTMLäöüß와 같은 독일어 문자를 탈출하지 않으며 아마도 더 ... Nokogiri를 사용하여 아직 확인하지는 않았지만 더할 나위가 있습니다.
— 뷰티

HTMLEntities는 가볍고 유능한 선택입니다. 나는 노코 기리를 많이 사용하며, 이미로드하지 않은 경우 HTMLEntities를 사용합니다. CGI가 오래되었습니다.
— Tin Man

36

Rails에서 문자를 해독하려면 다음을 사용하십시오.

<%= raw '<html>' %>

그래서,

<%= raw '&lt;br&gt;' %>

출력 할 것이다

<br>

5
이것은 뷰에서만 작동합니다. ActiveRecord에서도 작동하는 것이 필요합니다.
— Kostas

3
방금 디버거에서 테스트했습니다-raw '& lt br & gt'==> '& lt br & gt'.
— Will Tomlins

13
#raw아무것도 해독하지 않습니다. 뷰 에 문자열을 인코딩 하지 않도록 지시합니다 . 문자열을에 래핑하여 ActiveSupport::SafeBuffer플래그 ( html_safe?)를 true로 설정하여이를 수행합니다. 뷰는이 플래그를 사용하여 이스케이프하지 않고 문자열을 HTML에 직접 삽입 할 수 있는지 판별합니다. html_safe프로그래머가 문제의 문자열이 이미 올바르게 이스케이프되었다는 표시 로 생각하고 싶습니다 .
— Moxley Stratton

9

이 작업을 수행하기 위해 새 종속성을 추가하지 않으려는 경우 (예 HTMLEntities:) 이미 사용중인 Hpricot경우 이스케이프 및 이스케이프를 모두 해제 할 수 있습니다. 그것은 훨씬 더 많은 것을 처리합니다 CGI:

Hpricot.uxs "foo&nbsp;b&auml;r"
=> "foo bär"

5
Hpricot는 더 이상 유지 관리되지 않습니다.
— SamStephens

2
Hpricot 대신 XML / HTML 구문 분석의 사실상 표준 인 Nokogiri를 사용하십시오 .
— Tin Man


-5
<% str="<h1> Test </h1>" %>

result: &lt; h1 &gt; Test &lt; /h1 &gt;

<%= CGI.unescapeHTML(str).html_safe %>

사용자가 입력 한 텍스트에 html_safe를 추가하면 안전하지 않을 수있을 때 안전하다는 의견을 전달한다고 생각합니다. 이렇게하면 사용자가 해당보기를로드 할 때 위험에 노출 될 수 있습니다.
— user1515295

왜 그렇게 부정적인지 모르겠습니다. 이 질문에 대한 모든 해결책을 시도했습니다. 이것 만이 잘 작동합니다. HTML 안전에 대해 사용자는 HTML을 렌더링하기를 원하며 HTML_SAFE는 정확합니다.
— Diego Somar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.