このキャラクターは何ですか: '*'?


48

友人がキャラクターを含むSlackチャットルームにコマンドを貼り付けました*。これは通常のように見えますが、そうで*はありません:

$ 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にいます)と、彼らのシステムで通常のアスタリスクとして機能することを知っています。Slackが何らかの形で変更したと仮定しています。だから、誰がそのキャラクターが何かを知っていますか?

奇妙なキャラクターを質問から直接コピーできないことに注意してください。どうやら、Stack Exchangeエンジンは末尾の非印刷文字を削除します。「編集」リンクをクリックして、代わりにそこからコピーします。


unipropsは、Unicode::TusslePerlモジュールに含まれているきちんとした小さなスクリプトで、指定したキャラクターに関する情報を識別して出力します。


再現できません。ord("*")貼り付けた文字列とネイティブ*キーに使用しましたが、両方で同じ番号を取得しました(42)。
3月Ho

7
@MarchHoいまいましい、SEエンジンはそれを食べているようです。投稿する前にテストし、奇妙な文字をコピーできました(ただし、問題はそこに余分な非印刷文字が追加されていることです)編集リンクをクリックして、そこからコピーする必要があります。
テルドン

2
奇妙なことに、Androidアプリでは、スペースのあるゼロが通常のスペースであるかのように表示されます。
デロバート

1
興味深いことに、「編集」から端末に貼り付けると、urxvt既にとして表示され*<200b>ます。
ボードー

コードセクション(uniprops行など)からコピーすると、質問ソースに移動する必要なくOKがコピーされます。(Python3インタープリターに貼り付けること'*\u200b'も示しています)
TessellatingHeckler

回答:


71

貼り付けに失敗したのは、完全に規則的なアスタリスクであるアスタリスクではなく、ユニコード文字U + 200Bが原因です。文字はであるためZERO WIDTH SPACE、コピー時には表示されません。

Pythonコードの使用:

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

この関数uniconvは、入力文字列(この場合はu"'*'?")を16進形式のUnicodeコードページに変換します。u文字列のプレフィックスは、文字列をUnicode文字列として識別します。

出力を取得できました:

0x27 0x2a 0x200b 0x27 0x3f

我々は明らかにそれを見ることができ0x270x2aおよび0x3f文字のASCII / Unicodeの16進値であり'*そして?それぞれ。それはを残す0x200bため、キャラクターを識別します。

Pythonコードを本体に貼り付けると、SEのMarkdownソフトウェアによってU + 200B文字が削除されたことに注意してください。期待される結果を得るには、編集ビューを使用してタイトルから直接コピーする必要があります。


5
に置き換えるstrhex、コードポイントが16進数で出力されるため、認識や検索が容易になります。
deltab

と呼ばれる専用のPythonモジュールもありunicodedataます。これを使用して、キャラクター名、カテゴリなどを照会できます
。– bodo

4
ZERO WIDTH SPACEおよびZERO WIDTH JOINERキャラクターは、一般的なスパム用語をブロックしようとするコメントシステムで使用すると便利です。たとえば、バーニーサンダースが社会主義者として上院に選出されたことを指摘するには(「Cialis」のスパムトラップをトリップすることなく)、HTMLエンティティが尊重される場合は「Soci&zwj; alist」と書くか、Character Mapの文字を貼り付けますそうでない場合は同等です。
モンティハーダー

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>

したがって、実際に持っていたのは、2つのUnicode文字、通常*とゼロ幅のスペースでした。


6
それを行う別の方法はprintf '\342\200\213' | uninameです。(uninameはuniutilsパッケージに含まれています。)
deltab

1
このサイトからさまざまなフォーマット変換を行うことができます。HEXの場合002A 200B、utf-8の2A E2 80 8B場合はutf-16の場合002A 200B...
Hastur
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.