2022年12月1日、Discordはカスタマイズされたオリジナルのフォント「gg sans」を導入しました。ggは"Good Game"に由来するようです。Web フォントなどを利用して Discord 上の表示がこのフォントに順次切り替わる予定です。
https://support.discord.com/hc/ja/articles/9507780972951-gg-sans-フォントアップデートについてのFAQ
DiscordのCEO(Jason氏)より返事があり、ツとノの字形がgg sansから削除されたとのことです。右括弧は現時点で残っているようです(これは当初のわたしの指摘がツとノのみに限られていたせいです)。
https://twitter.com/jasoncitron/status/1598906714052780032
12/3時点でJason氏からの返信に右括弧が残っているという旨を補足しました。
12/4 午前にDiscordのエンジニア Brandon氏より連絡があり、括弧等の修正が完了したとのことです。
https://twitter.com/aweary/status/1599208200359669760
こちらで確認する限り、CJK関連の約物(右括弧、半濁点、縦書き用括弧[1])はすべて削除され、gg sansが適用された状態でも日本語は従来の表示に戻った事が確認できました。Discordチームの迅速な対応に感謝いたします。
以下の記事の内容は12月2日深夜時点での内容を示しています。
既にお気づきの方もいらっしゃる通り、このフォントが日本語表示を乱してしまっています。
なぜなら、「ツ」と「ノ」と全角括弧の右括弧だけがgg sansに収録されており、通常の日本語フォントと混在して表示されるためです。
フォントデータを見ても「ツ」と「ノ」だけが日本語のカタカナの文字として用意されています。また、全角括弧のうち、閉じ括弧(右括弧、U+FF09)だけが用意されています。
gg sans SemiBold に含まれるグリフの一覧(一部 2022/12/03時点)

gg sans SemiBold に含まれるグリフの一覧(約物関連の一部 2022/12/03時点)
実際にこの2文字が含まれる文字列を Discord 上で見てみると、読みづらさを感じるはずです。


フォントデータは文字の集合で、1文字ずつデザイナーが設計した字形が文字コードと対応づけられたものです。

モリサワ UD新ゴ Pr6N Mの例(一部)
しかし、そのフォントデータがカバーしていない文字というものが存在します。
日本語用として作られたフォントにアラビア文字はありませんし、その逆も然りです。個人製作のフリーフォントであれば「製作途中のバージョンなので、文字がまだ収録されていない」といったパターンなどもあります。
フォント上で未定義の文字が含まれた文字列を表示する場合、ソフトウェア側ではフォールバックという手段を取ります。たとえば、MS 明朝を指定した環境でアラビア語の文字列が含まれていた場合、アラビア語部分は空白にするのではなく対応した別のフォントを呼び出して、そこだけそのフォントで表示するというものです。
Webブラウザなどではこの処理がデフォルトで行われており、Web デザイナーやフロントエンドエンジニアが特殊な処理をすることなくフォールバックが行われます。例えば以下のように CSS で欧文フォントの Gill Sans を指定した場合、Gill Sans に含まれない日本語部分は自動的に別のフォントで表示されます。
font-family:"Gill Sans";Discord もブラウザ上で動作する[2]アプリケーションであるため、この挙動が発生しています。
gg sans がもし一般的な欧文フォントであれば、カタカナを含む日本語文字列は別フォントで表示され、違和感は生じなかったことでしょう。しかし、「ツ」と「ノ」だけ含まれていたため、この2文字に関してはきちんと gg sans で表示されてしまうのです。
!以上の技術的背景より、「Discord の日本語フォントがおかしい」という表現は厳密には誤りです。正確に言うなら、「Discord のフォントが2文字だけ日本語の字形を用意したことにより、日本語表示が不自然になっている」となります。
なぜ Discord はこの2文字のカタカナと片方のカッコを欧文フォントに含めてしまったのでしょうか。
肩をすくめる(shrug)リアクションを欧米のインターネット文化では¯\_(ツ)_/¯ と表記します。ツが少し傾いた顔に見えるからでしょう。
ノについては日本語AAの"ノシ"と同じく、手を掲げたニュアンスで用いられているものだと思われます。
以前から Discord には/shrug という標準コマンドがあり、このAA(アスキーアート)を容易に呼び出すことができます。
また、/tableflip(テーブルをひっくり返す)/unflip(テーブルを元に戻す)というコマンドもあります。


当該のAAをDiscord上で表示した例
上記AAの実際の文字列¯\_(ツ)_/¯(╯°□°)╯︵ ┻━┻┬─┬ ノ( ゜-゜ノ)推測ではありますが、Discord はこれらの標準コマンドで使用されているカタカナと約物を、一貫した Visual Identitiy のために gg sans に含めたのではないでしょうか。
アスキーアートのデザインを整えるために日本語のコミュニケーションが阻害されてしまっている現状は非常に残念です。Discord のデザイナーとエンジニアはカタカナを「英語圏のミームを表現するための記号」として見做していることになり、一種のcultural appropriationと批判されてもやむを得ないのではないでしょうか。
もちろん、AAに罪があるわけではありません。日本語AAや顔文字でもキリル文字やカナダ先住民文字を含んだものなどがあり、これらは文字列だけで豊かな表現を可能にするだけでなく、世界の文字に対する親しみをもたらす効果があると思います。
しかし、変更不可能なアプリケーションのフォントとして、当該の言語の文字をAAのために「奪う」ことは別です。国際的に使用されるアプリケーションのフォントとしてはあってはならない振る舞いです。
個人的には以前から Discord の国際化・ローカライゼーションの姿勢には疑問を感じることが多々ありました。例えば、Discord の言語選択アイコンには国旗が表示されています。
世界の多くの言語において、言語と国家は1対1の対応ではありません。過去に植民地支配を受けた地域では旧宗主国の言語(フランス語など)が話されている例などがわかりやすいでしょう。それ以外でも、たとえばウクライナにおいてはロシア語を母語とするウクライナ人が多数存在するといった状況もあります(ゼレンスキー大統領も母語はロシア語です)。
このように、言語と国家は非常に政治的・アイデンティティ的にセンシティブな問題であるため、言語選択では国家や国旗を示すべきではありません。国際化(i18n)の原則としてはかなり初歩的なものですし、そもそも常識的に「ロシア語を母語とするウクライナ人にロシア国旗を選択させる」ようなことがセンシティブであることは容易に推測できるはずです。

言語選択画面(2022/12/03)
しかしながら、Discord はこの変更を2022年に悪気無く実施しています。国際的に展開しているサービスとしては文化的なリスペクトや配慮が大きく欠けているように思います。

2022年6月6日のアップデートにおける Discord 上のメッセージ
Discord が標準コマンドで利用している文字を整えたいという意図は理解しました。この場合、リガチャ(合字)を用いることで解決できるのではないかと思います。
日本語ではあまり馴染みがありませんが、欧文などでは特定の文字が並ぶ組み合わせにおいて、通常と異なる字形を利用することがあります。たとえば文中で f と i が連続した場合のみ、あらかじめ用意された "fi" が表示されるというものです。これをリガチャ(合字)とよび、フォントデータにはこれをサポートする仕組みがありますし、Webフォントでも利用出来ます。

合字の例(Wikimedia Commonsより)
これらは特定の文字だけで利用できるというわけではなく、フォントデータ側で任意の組み合わせを設定できます。実際、その仕組みを利用して「twitter」と入力するとアイコンが表示されるといったフォントを製作している方もおられます。
https://kudakurage.hatenadiary.com/entry/20120720/1342749116
gg sans もこの仕組みを利用することで、日本語の表示を破壊することなく特定のアスキーアートを美しく表示できるのではないでしょうか。
コミュニケーションにとって文字は重要なものです。世界中の人々が母語でスムーズにやりとりするために、先人たちは様々な努力を尽くしてきました。その成果がUnicodeや各種フォントに現れています。
それらを崩すことは望ましいことではありません。日本語ユーザとしてきちんと声を上げていくべきだと思います。
サポートフォーラムにもチケットが出ているようですので紹介しておきます。
https://support.discord.com/hc/en-us/community/posts/10647396120855
詳しく解説していただいてありがとうございます。
文末に、Ligature を用いて日本語表示を破壊せずアスキーアートを表示する提案がおっしゃいましたが、実際に Ligature の仕組みには Glyphs Substitution Table (GSUB) という OpenType の機能によって実現されています。その名の通りに、GSUB はフォント内に既存する glyph の置き換えルールを定義する表であり、書き換えされたい glyph は設置されないとできない状態であります。つまり、gg sans は日本語表示の現状を改善したいなら、アスキーアート用のグリフを削除するか、全カタカナをフォントに入れるかの二択に迫ると考えます。
参考:OpenType Spec – Glyphs Substitution Table (GSUB)
https://learn.microsoft.com/en-us/typography/opentype/spec/gsub
コメントありがとうございます。
UnicodeにはPrivate Use Area(第15面・第16面)という外字を保存する領域が規定されており、そこにAA用の「ツ」を配置させ、GSUB上で定義すれば問題ないように思われます。
例えば、本文中で挙げたLigature Symbolsや、有名どころのFontawesomeでもPrivate Use Areaが利用されています。

はじめまして、すごく興味深い問題だな、と読んでいました。 @eana さんのコメントは
フォント内に既存する glyph
というところが大事だと思いました。 @ryo-a さんのPUA案でも、そうでない日本語領域に「まず定義する」のは避けられないならツ 等のデフォルト表示もgg sansの定義に従うので、結局は日本語ユーザーの既存フォントとの不整合は避けられない気がします。
(追記: 「補足」に気付かず入れ違いで書いてしまいました。すでに削除済みである、という文脈からずれてるところはごめんなさい)
それで自分は、別の方向をいくつか考えていました。1と2はできると思いますが、対応コストはありそうです。(3と4は単なるSFです)
この問題は、「上書きしていいフォント(非日本語部分)とフォールバック用フォント(日本語部分)が混在している」という問題にも捉えられると思います。だとすると、内部で前者と後者を分ければ解決です。
つまりは、今のgg sansものから日本語部分の3文字を「抜いたフォント」と、その「3文字だけのフォント」を別に持つという案です。まだ内部で使っているだけのようですから、外部のアナウンス・ブランドとしての呼称は変えなくてもよいでしょう。
仮に両者をgg sans l /gg sans j と呼ぶなら、以下でよいはずです。中央のsans 部分は、日本語用グリフがあるユーザーではそこで終わり、なければgg sans j に落ちます。
font-family:"gg sans l", sans,"gg sans j";ただ上記CSSの修正と、Discordの内部でフォントを2つ用意する、というコストは増えます。とはいえ、自分が考えた中では一番現実的な案です。
Discord側が日本語用フォントを指定したい文字は3文字と決まっているので、フォントを分けなくともそこだけ特別扱いすればいい、という考えです。
テキスト表示の部分でがんばって、すべてのツ等 を<span>ツ</span> とかに置き換えます。そしてCSSで
.gg-fallback{font-family: sans,"gg sans";}とすれば、sans にツ を持つユーザーはgg sans を使いません。
欠点として、DOMを書き換えるのはめんどくさいですね……他のロジックともぶつかるかもしれません。
案2とほぼ変わりませんが、JSで走査した結果でDOMを書き換えず、Rangeにして持っておきます。
そしてCSS Custom Highlight APIをつかってハイライト扱いでスタイルを局所的に変更すれば、DOM構造に変化がなくスタイルを変えられます。Chromeにはすでに入っているようですし……
と思ったのですが、手元のChrome 107ではフォント指定はできないようで、残念ながら失敗しました。
https://jsfiddle.net/wd6t73bx/
CSSセレクタで文字単位で指定できれば、と一瞬思ったのですが、自分が調べた限り、そんなものは現存しないようです。
自分はCSSの専門知識を持ち合わせていないのですが、少なくとも案1よりは処理量増えそうですし、そういうものなのかもしれません。
@font-face-only("ツ","ノ",")"){font-family: sans,"gg sans";}Tokyo-based Creative Technologist. Aviation Geek. OSINT CTF Player.