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.