이 문자는 무엇입니까 : '*'?


48

친구 가 캐릭터를 포함한 슬랙 대화방에 명령을 붙여 넣었습니다 *. 이것은 정상적인 것처럼 보이지만 *그렇지 않습니다.

$ uniprops '*​'
uniprops: no character named ‹*​›

uniprops별표로 달리면 내 컴퓨터에 입력 할 때 얻을 수 있지만

$ uniprops '*'
U+002A ‹*› \N{ASTERISK}
    \pP \p{Po}
    All Any ASCII Assigned Basic_Latin Punct Is_Punctuation Common Zyyy Po P
       Gr_Base Grapheme_Base Graph X_POSIX_Graph GrBase Other_Punctuation
       Pat_Syn Pattern_Syntax PatSyn POSIX_Graph POSIX_Print POSIX_Punct Print
       X_POSIX_Print Punctuation Unicode X_POSIX_Punct

또한 그것을 통과하여 실제 별표가 아님을 알 수 있습니다 od.

$ printf '*​' | od -c
0000000   * 342 200 213
0000004

정상적인 것은 다음과 같습니다.

$ printf '*' | od -c
0000000   *
0000001

다음은 미스터리 캐릭터입니다.

*

그리고 정상적인 별표 (예, 동일하게 보입니다) :

*

따라서 uniprops이것이 무엇인지 알지 못하며 http://www.fileformat.info/에서도 찾을 수 없습니다 . 나는 그것을 붙여 넣은 친구가 OS X (Linux에 있음)에 있으며 일반적인 별표로 시스템에서 작동한다는 것을 알고 있습니다. 슬랙이 어떻게 든 그것을 변경했다고 가정합니다. 그래서 그 인물이 무엇인지 아는 사람이 있습니까?

질문에서 이상한 문자를 직접 복사 할 수는 없습니다. 분명히, Stack Exchange 엔진은 후행 비 인쇄 문자를 제거합니다. "편집"링크를 클릭하고 대신 복사하십시오.


unipropsUnicode::TusslePerl 모듈에 포함 된 깔끔한 작은 스크립트로, 제공 한 캐릭터에 대한 정보를 식별하고 인쇄합니다.


재생할 수 없습니다. 나는 사용 ord("*")하여 붙여 넣은 문자열과 기본에 대한 *키를 모두 (42)에 대해 같은 수를 얻었다.
March Ho

7
@MarchHo 젠장, SE 엔진이 그것을 먹는 것 같습니다. 게시하기 전에 테스트했으며 이상한 문자를 복사 할 수는 있지만 (문제는 추가 인쇄되지 않은 문자가 추가되었다는 것을 이해하기 시작했지만) 게시 된 질문에서도 복사 할 수 없습니다. 편집 링크 를 클릭하고 거기에서 복사 해야합니다 .
terdon

2
이상하게도 Android 앱에서 공백이있는 0은 마치 일반 공간 인 것처럼 표시됩니다.
derobert

1
흥미롭게도 'edit'에서 터미널에 붙여 넣을 때 urxvt이미로 표시됩니다 *<200b>.
bodo

코드 섹션 (예 : uniprops 행)에서 복사하면 질문 소스로 이동하지 않아도 OK가 복사됩니다. (Python3 인터프리터에 붙여 넣는 것도 보여줍니다 '*\u200b')
TessellatingHeckler

답변:


71

붙여 넣기는 별표 (완전히 일반적인 별표)가 아니라 유니 코드 문자 U + 200B로 인해 실패했습니다 . 문자는 ZERO WIDTH SPACE이므로 복사 할 때 표시되지 않습니다.

파이썬 코드 사용하기 :

stro=u"'*​'?"
def uniconv(text):
    return " ".join(hex(ord(char)) for char in text)
uniconv(stro)

이 함수 uniconv는 입력 문자열 (이 경우 u"'*'?")을 16 진수 형식의 해당 유니 코드 코드 페이지로 변환합니다. u문자열 의 접두사는 문자열을 유니 코드 문자열로 식별합니다.

출력을 얻을 수있었습니다.

0x27 0x2a 0x200b 0x27 0x3f

우리는 명확하게 볼 수 있습니다 0x27, 0x2a그리고 0x3f아스키 / 유니 코드 16 진수 문자에 대한 값입니다 ', *그리고 ?각각. 즉 잎 0x200b때문에 문자를 식별.

본문에 붙여 넣을 때 Python 코드에는 SE의 Markdown 소프트웨어가 U + 200B 문자를 제거했습니다. 예상 결과를 얻으려면 편집보기를 사용하여 제목에서 직접 결과를 복사해야합니다.


5
교체 strhex인식하거나 찾아 그들에게 쉽게 만드는 16 진수로 출력 할 것이다 코드 점을.
deltab

unicodedata캐릭터 이름, 카테고리 등을 쿼리 할 수 있는 전용 python 모듈도 있습니다.
bodo

4
ZERO WIDTH SPACE 및 ZERO WIDTH JOINER 문자는 일반적인 스팸 용어를 차단하는 주석 시스템과 함께 사용하면 편리합니다. 예를 들어 Bernie Sanders가 상원 의원으로 사회주의 자로 선출되었다고 지적하려면 ( "Cialis"에 대한 스팸 트랩을 트립하지 않고) HTML 엔티티가 존중되는 경우이를 "Soci & zwj; alist"로 쓰거나 Character Map에서 캐릭터에 붙여 넣으십시오. 그렇지 않은 경우 동등합니다.
Monty Harder

27

Ask Ubuntu 대화방에서 @Rinzwind의 도움으로 문제가 전혀 문자가 아니라는 것을 알았습니다. 의 출력에 유의하십시오 od.

$ printf '*​' | od -c
0000000   * 342 200 213
0000004

342 200 213다른 문자의 진수 표현이며, 우리가 사용할 수있는 이 사이트 를 찾기 위해 :

Character                   ​               
Character name                              ZERO WIDTH SPACE
Hex code point                              200B
Decimal code point                          8203
Hex UTF-8 bytes                             E2 80 8B
Octal UTF-8 bytes                           342 200 213
UTF-8 bytes as Latin-1 characters bytes     â <80> <8B>

그래서 실제로 내가 가진 것은 두 개의 유니 코드 문자, 일반 *너비와 0 너비의 공백이었습니다.


6
그렇게하는 또 다른 방법은 printf '\342\200\213' | uniname입니다. (uninames는 uniutils 패키지의 이름입니다.)
deltab

1
에서 이 사이트에 당신은 다른 형식으로 변환을 할 수 있습니다 : 그것은 준다 HEX을 위해 002A 200BUTF-8, 2A E2 80 8BUTF-16 002A 200B...
Hastur
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.