2010-04-06 5 views
26

utf-8 json으로 인코딩 할 때 공백 대신에 \u00a0 (공백이 아닌 공백)으로 HTML 텍스트 영역 또는 입력에서 사용자가 입력 한 데이터가 전송되는 경우가 있습니다.Ruby에서 공백으로 공백으로 변환

나는 사용자가 의도적으로 공백 대신 줄 바꿈하지 않는 공백을 넣지 않는다는 것을 알고 있기 때문에 파이어 폭스의 버그라고 생각한다.

Ruby에는 두 가지 버그가 있으며 그 중 하나는 다른 하나와 충돌하는 데 사용할 수 있습니다.

\s은 (는) \u00a0과 일치하지 않습니다.

그러나 일치하지 않아야하는 [^[:print:]]\xC2\xA0이 모두 일치하지만, 문제를 해결하기에 덜 이상적인 방법이라고 생각합니다.

이 문제를 해결하기위한 다른 권장 사항이 있습니까?

+1

어떤 Ruby 버전입니까? 1.9.2/\ u00a0 /에 일치합니다. – steenslag

+0

\ s가 \ u00a0와 일치하지 않습니다. \ u00a0이 1.9와 일치하지만 1.8에 대해 잘 모르겠습니다. – CoolAJ86

+7

규칙 # 1 : 매우 인기있는 프로그램, 특히 테스트를 거친 버그에서 발견 된 버그 파이어 폭스의 텍스트 영역 처리와 같이 광범위하게 사용되며, 매우 조용하고 조심스럽게 테스트를 진행합니다. 100 번 중 99 번은 문제가 울타리 옆에 있습니다. 사람들이 텍스트를 붙여 넣을 가능성이있는 텍스트 필드에 줄 바꿈되지 않는 공백이 표시되면 Microsoft Word 또는 공백으로 을 대치 할 수있는 편집기로 의심됩니다. 페이지를 작성하고 텍스트 영역을 넣은 다음 문제를 복제하려고하면 쉽게 이론을 테스트 할 수 있습니다. –

답변

1

이전 버전의 루비 (1.8.x)의 경우 수정 사항은 해당 질문에 설명되어 있습니다.

이 문제는 최신 버전의 ruby ​​1.9+에서 수정되었습니다. 최신 루비와 함께, 질문에 대답

+0

좀 더 구체적인 정보를 얻을 수 있습니까? 나는 1.9.3p194에서 똑같은 문제를 겪었다. \ s는 유니 코드 비 분리 공간과 일치하지 않지만 \ u00a0는 일치합니다. – nasmorn

2

\ s가 \ u00a0과 (와) 일치하지 않는 이유가 무엇이든간에.

나는 "어떤 이유에서 건"그게 아니라고 생각합니다. POSIX 및 \ p 구조 문자 클래스 만 유니 코드를 인식합니다. 문자 클래스 약어는 없습니다 :

Sequence As[...]  Meaning 
    \d [0-9]   ASCII decimal digit character 
    \D [^0-9]   Any character except a digit 
    \h [0-9a-fA-F] Hexadecimal digit character 
    \H [^0-9a-fA-F] Any character except a hex digit 
    \s [ \t\r\n\f] ASCII whitespace character 
    \S [^ \t\r\n\f] Any character except whitespace 
    \w [A-Za-z0-9\_] ASCII word character 
    \W [^A-Za-z0-9\_] Any character except a word character 
+2

오, 그건 **로 ** **, 괜찮아. 단지 그렇지 않습니다. 내 대답을 보라. – tchrist

+0

사양과 코드 사이에 차이가 있습니다. 그것이 스펙으로 인해 예정되어 있는지 아닌지는 지금 당면 의의가 없다는 것입니다. 거기에 있지 않기 때문에 아무리 중요하다 할지라도, 핵심 팀의 누군가가 그것을 추가하기로 결정하기 전에는 거기에 있기를 원합니다. . 현실은 코딩되지 않았기 때문에 작동하지 않아야한다는 것입니다. 아마 미래의 변화가있을 것입니다. 스펙을 충족시키는 것을보고 싶지만 그들은 나에게 묻지 않습니다. –

+0

그건 정말 이상한 일입니다. tchrist는 절대적으로 정확하며, 현재 작동하지 않기 때문에 "작동하지 않아도되는"것을 말하는 것은 내가 잠시 동안 읽은 최고의 공허한 진리입니다. 누군가가 Ruby를 실제로 만들 때까지 [[: space :]]에 대한 gsub는 실제로 표준을 준수합니다. – owenmarshall

6

유니 코드 공백에 대한 \s을 사용할 수없는 경우 UTS#18 “Unicode Regular Expressions” Annex C on Compatibility Properties\s에 따라, 절대적으로 유니 코드 공백에 맞게을 요구하기 때문에, 즉 루비 정규식 구현의 버그가있어 코드 포인트.

표준 권장 사항과 POSIX 호환성을 자세히 설명하는 두 개의 열이 \s 경우에 동일하기 때문에 위글 허용이 허용되지 않습니다. UTS # 18의 RL1.2a을 사용하면 유니 코드 표준을 준수하지 않을 수 있습니다.

RL1.2a를 충족시키지 않으면 유니 코드에서 정규 표현식을 사용하는 데 필요한 가장 기본적인 기본 기능인 레벨 1 요구 사항을 충족하지 못합니다. 그것 없이는, 당신은 꽤 많이 잃어버린 것입니다. 이것이 표준이 존재하는 이유입니다. 내 생각에 Ruby는 다른 여러 레벨 1 요구 사항을 충족시키지 못했습니다. 따라서 실제로 정규 표현식을 사용하여 유니 코드를 처리해야하는 경우 적어도 레벨 1을 충족하는 프로그래밍 언어를 사용할 수 있습니다.

\p{Whitespace}을 나타 내기 위해 \p{Zs}과 같은 유니 코드 일반 범주 속성을 사용할 수 없습니다. Whitespace 속성은 일반 카테고리가 아닌 파생 속성이기 때문입니다. 구분 기호뿐만 아니라 제어 문자도 포함되어 있습니다.

2

실제 작동하는 IRB 코드 예제 (2012 년 5 월)

루비 1.9

require 'rubygems' 
require 'nokogiri' 
RUBY_DESCRIPTION # => "ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-linux]" 
doc = '<html><body> &nbsp; </body></html>' 
page = Nokogiri::HTML(doc) 
s = page.inner_text 
s.each_codepoint {|c| print c, ' ' } #=> 32 160 32 
s.strip.each_codepoint {|c| print c, ' ' } #=> 160 
s.gsub(/\s+/,'').each_codepoint {|c| print c, ' ' } #=> 160 
s.gsub(/\u00A0/,'').strip.empty? #true 

루비 1.8

require 'rubygems' 
require 'nokogiri' 
RUBY_DESCRIPTION # => "ruby 1.8.7 (2012-02-08 patchlevel 358) [x86_64-linux]" 
doc = '<html><body> &nbsp; </body></html>' 
page = Nokogiri::HTML(doc) 
s = page.inner_text # " \302\240 " 
s.gsub(/\s+/,'') # "\302\240" 
s.gsub(/\302\240/,'').strip.empty? #true 
37

사용 /\u00a0/이 아닌 깨는 공간을 개발하였습니다. 예를 들어 s.gsub(/\u00a0/, ' ')은 줄 바꿈하지 않는 모든 공백을 일반 공백으로 변환합니다.

/[[:space:]]/을 사용하여 공백을 포함하지 않는 유니 코드 공백을 포함하여 모든 공백과 일치시킵니다. 이는 ASCII 공백과 만 일치하는 /\s/과 다릅니다.

은 참조 : (이 질문과 직접적으로) 루비와 관련이없는 동안 Ruby Regexp documentation

+0

http://www.unicode.org/versions/Unicode6.2.0/ch06.pdf - 공백 문자를보십시오. 그러나 id가 불완전하게 보입니다. –

+0

'[[: space]]'(자기 자신에게주의 :'[: space]'가 아니라)를 사용하는 것에 대한 제 대답이 수정되었습니다. –

+0

"s.gsub (/ \ u00a0 /, '')"은 제가 찾고있는 것입니다. –

1

문제 의 핵심은Alt 키 + 맥 공간가 아닌 파괴를 생산하고 수 있습니다 공간.

이로 인해 모든 종류의 이상한 동작이 발생할 수 있습니다 (특히 단말기에서).

자세한 내용을 알고 싶으신 분은 얼마 전이 주제에 대해 "Why chaining commands with pipes in Mac OS X does not always work"이라고 적었습니다.

관련 문제