동료가이 JavaScript 알림 라인을 보여줄 때 당황했습니다 42.
alert(2+ 40);
빼기 부호처럼 보이는 것이 실제로 의미가 다른 비전의 유니 코드 문자라는 것이 금방 밝혀졌습니다.
이것은 표현식이 구문 분석 될 때 해당 문자가 구문 오류를 생성하지 않는 이유를 궁금하게했습니다. 또한 이와 같이 동작하는 문자가 더 있는지 알고 싶습니다.
답변
해당 문자는 공백 문자 인 “OGHAM SPACE MARK” 입니다. 따라서 코드는와 동일합니다 alert(2+ 40)
.
또한 이와 같이 동작하는 문자가 더 있는지 알고 싶습니다.
ZS 클래스의 모든 유니 코드 문자는 자바 스크립트에서 공백 문자입니다 , 하지만 많은 수는 없을 것 같다 .
그러나 JavaScript는 식별자에 유니 코드 문자를 허용하므로 와 같은 흥미로운 변수 이름을 사용할 수 있습니다 ಠ_ಠ
.
답변
다른 답변을 읽은 후 공백처럼 동작하는 U + 0000 – U + FFFF 범위의 모든 유니 코드 문자를 찾는 간단한 스크립트를 작성했습니다. 보이는 것처럼 브라우저에 따라 U + 0085와 U + FFFE에 대해 의견이 일치하지 않는 26 개 또는 27 개가 있습니다.
이러한 문자의 대부분은 일반적인 공백처럼 보입니다.
답변
사용중인 문자가 실제 빼기 기호 (하이픈)보다 실제로 더 긴 것 같습니다.
-
위쪽은 사용중인 것이고 아래쪽은 빼기 부호입니다. 이미 알고 계신 것 같습니다. 이제 Javascript가 왜이 기능을 사용하는지 봅시다.
사용하는 문자는 실제로 공백 문자 인 ogham 스페이스 마크 이므로 기본적으로 공백과 동일한 것으로 해석되므로 명령문이 alert(2+ 40)
Javascript 처럼 보입니다 .
Javascript에는 이와 같은 다른 문자가 있습니다. Wikipedia 에서 전체 목록을 볼 수 있습니다 .
이 캐릭터에 대해 흥미로운 점은 Chrome (및 가능한 다른 브라우저)이 페이지 상단 막대에서이를 해석하는 방식입니다.
1680
안에 있는 블록입니다 . 실제로는 오그 햄 스페이스 마크의 유니 코드 번호입니다. 이 작업을 수행하는 기계 일 뿐이지 만 이상한 일입니다.
나는 이것을 다른 언어로 시도하여 어떤 일이 일어나고 나는 이것이 얻은 결과인지 확인하기로 결정했습니다.
작동하지 않는 언어 :
파이썬 2 & 3
>> 2+ 40
File "<stdin>", line 1
2+ 40
^
SyntaxError: invalid character in identifier
루비
>> 2+ 40
NameError: undefined local variable or method ` 40' for main:Object
from (irb):1
from /home/michaelpri/.rbenv/versions/2.2.2/bin/irb:11:in `<main>'
자바 ( main
메소드 내부 )
>> System.out.println(2+ 40);
Main.java:3: error: illegal character: \5760
System.out.println(2+?40);
^
Main.java:3: error: ';' expected
System.out.println(2+?40);
^
Main.java:3: error: illegal start of expression
System.out.println(2+?40);
^
3 errors
PHP
>> 2+ 40;
Use of undefined constant 40 - assumed ' 40' :1
씨
>> 2+ 40
main.c:1:1: error: expected identifier or '(' before numeric constant
2+ 40
^
main.c:1:1: error: stray '\341' in program
main.c:1:1: error: stray '\232' in program
main.c:1:1: error: stray '\200' in program
exit status 1
가다
>> 2+ 40
can't load package: package .:
main.go:1:1: expected 'package', found 'INT' 2
main.go:1:3: illegal character U+1680
exit status 1
펄 5
>> perl -e'2+ 40'
Unrecognized character \xE1; marked by <-- HERE after 2+<-- HERE near column 3 at -e line 1.
작동하는 언어 :
계획
>> (+ 2 40)
=> 42
C #
( Main()
방법 내부 )
Console.WriteLine(2+ 40);
Output: 42
펄 6
>> ./perl6 -e'say 2+ 40'
42
답변
이상한 이유로 공백으로 분류한다는 사실과 관련이 있다고 생각합니다.
$ unicode
U+1680 OGHAM SPACE MARK
UTF-8: e1 9a 80 UTF-16BE: 1680 Decimal:  
( )
Uppercase: U+1680
Category: Zs (Separator, Space)
Bidi: WS (Whitespace)
답변
또한 이와 같이 동작하는 문자가 더 있는지 알고 싶습니다.
누군가의 코드에서 세미콜론 (U + 003B)을 그리스어 물음표 인 U + 037E로 잘못 대체하는 것에 대해 잠시 동안 읽은 것을 기억합니다.
둘 다 동일하게 보입니다 (그리스인들이 U + 003B를 사용한다고 생각하는 정도까지). 그러나이 기사에서는 다른 것이 작동하지 않을 것이라고 언급했습니다.
Wikipedia에서 이에 대한 추가 정보는 다음과 같습니다. https://en.wikipedia.org/wiki/Question_mark#Greek_question_mark
그리고 이것을 SO 자체의 장난으로 사용하는 것에 대한 (닫힌) 질문. 내가 AFAIR를 처음 읽은 곳이 아닙니다 :
JavaScript Prank / Joke