web-dev-qa-db-ja.com

このキャラクターは「*」ですか?

友人が*という文字を含む 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::Tussle Perlモジュールに含まれているきちんとした小さなスクリプトで、指定した文字に関する情報を識別して出力します。

48
terdon

貼り付けは、完全に通常のアスタリスクであるアスタリスクが原因ではなく、 nicode文字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文字が削除されたことに注意してください。期待される結果を得るには、タイトルから直接コピーする必要があります。編集ビューを使用します。

71
March Ho

Ask Ubuntuチャットルームの@Rinzwindの助けを借りて、問題はまったくキャラクターではないことがわかりました。 odの出力に注意してください。

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

342 200 213は別の文字の8進数表現であり、 this site を使用して検索できます。

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つのユニコード文字、通常の*およびゼロ幅のスペース。

27
terdon