
2025/12/16 9:25
Creating custom yellow handshake emojis with zero-width joiners
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
## Summary Appleは2022年に多色調ハンドシェイク絵文字を追加し、単一の🤝から🫱🏻🫲🏿などの組み合わせへと拡張しました。通常の握手は1つのコードポイント(U+1FAF1)で構成されますが、複合ハンドシェイクは5つのコードポイントを使用します:U+1FAF1、肌色修飾子(例:U+1F3FB)、ゼロ幅結合文字(U+200D)、別の握手(U+1FAF2)、および第二の肌色修飾子(例:U+1F3FF)。各手に異なる肌色を付けたり、肌色を省略したりすることで、Appleのキーボードで提供されない新しいシーケンスが作成できます。例としては🫱🫲(三つのコードポイント)と五つのコードポイントバリアントがあります。 フィッツパトリック肌色スキームは1970年代の米国皮膚科医による尺度に由来し、欧州中心的偏向で批判されてきました。絵文字利用ではカテゴリ1と2が統合されています。ゼロ幅結合文字は別々のパーツを単一のグラフェムとして接続し、フォントがそれを1つの画像として描画する場合があります。 国旗は地域指示子シンボル(例:🇺🇸 + 🇨🇺)を連結してエンコードされます。これにより、結合されたコードポイントがISO国コードとして解釈されるため、JavaScript文字列の置換で予期しない結果になることがあります。 iOS/macOSでは、これらの複合ハンドシェイクは単一の大きな絵文字グリフではなく、別々のテキスト文字として表示される場合が多いです。そのため、ユーザーはプラットフォーム間で握手表示に不一致を目にすることがあり、開発者はインターフェース設計時にこれらのエンコーディング上の特殊性を考慮しなければなりません。
本文
2025年12月15日
Appleは2022年に多色調ハンドシェイク絵文字のサポートを追加し、単純な 🤝 を🫱🏻🫲🏿 などのハンドシェイクに置き換えることができるようになりました。一見すると似ているようですが、実際にはかなり違いがあります。
仕組み
各絵文字はUnicodeコードポイントで構成されています。
例:
[...'🤝'].map(c => 'U+' + c.codePointAt(0).toString(16)).join(' ')
結果:
🫱🏻🫲🏿 → U+1FAF1 U+1F3FB U+200D U+1FAF2 U+1F3FF
- U+1FAF1 – 🫱(右向き手)
- U+1F3FB – フィッツパトリックモディファイア 1(ライトスキントーン)
- U+200D – ゼロ幅結合子 (ZWJ)
- U+1FAF2 – 🫲(左向き手)
- U+1F3FF – フィッツパトリックモディファイア 6(ダークスキントーン)
ZWJ が鍵で、別々の絵文字をひとつのグラフェムに結合し、フォントが一つのシンボルとして描画することがあります(例:👩❤️💋👨)。
国旗とちょっとしたJavaScriptの挙動
国旗も2つの地域インジケーター記号で構成されます。
例:
'🇺🇸🇨🇺'.replace('🇸🇨', '🇦🇷') === '🇺🇦🇷🇺'
これは、ISOコード「US CU」(アメリカ合衆国 + キューバ)が「SC AR」(セーシェル + アルゼンチン)に置き換えられ、結果として UA RU(ウクライナとロシア)ができるためです。
カスタムハンドシェイクの作り方
構造を知れば、Apple の UI が通常提供しないハンドシェイクを作成できます:
- 片手だけにスキントーンモディファイアを付ける。
- 両手とも修飾せず、🫱🫲(🤝 と見た目が同じですがコードポイントは3つ)を得る。
console.log('\u{1FAF1}\u{200D}\u{1FAF2}\u{1F3FF}')
出力:
🫱🫲🏿 → U+1FAF1 U+200D U+1FAF2 U+1F3FF
console.log('\u{1FAF1}\u{1F3FF}\u{200D}\u{1FAF2}')
出力:
🫱🏿🫲 → U+1FAF1 U+1F3FF U+200D U+1FAF2
これらのカスタムハンドシェイクは多くのプラットフォームで正常に表示されますが、iOS/macOS では大きな絵文字としてではなくプレーンテキストとして表示されることがあります。おそらく Apple はそれらをテキスト列とみなしているためです。
執筆終了