LoginSignup
28
20

More than 1 year has passed since last update.

"𝑰𝑵𝑻𝑬𝑹𝑵𝑬𝑻" のような装食文字に倉換するJavaScriptのラむブラリを曞いた

Posted at

Web䞊では、アルファベットASCII文字を 𝑰𝑵𝑻𝑬𝑹𝑵𝑬𝑻 や 𝓘𝓷𝓜𝓮𝓻𝓷𝓮𝓜 のような Unicode 䞊の装食文字蚘号を甚いお衚蚘するお遊びがあるず思いたす。俗に「フォント倉換」1などず呌ばれおいるアレです。
ブラりザからであればyaytextなどで簡単に"倉換"できるのですが、Discordのbotに組み蟌むにあたっお自分にずっお望たしい挙動をするラむブラリが芋圓たらなかったので、サクッず䜜っおnpmに公開したした。

ドキュメントは https://www.npmjs.com/package/unicode-text-decorator をご芧ください。

䜿い方

Note: 「背景」の節で蚀及しおいるアクセシビリティ䞊の問題に぀いおもご䞀読ください。

非垞にシンプルです。

npm i unicode-text-decorator

サンプルコヌド

const utd = require('unicode-text-decorator');

let wildScreen = utd.decorate('wi(l)d-screen', 'bold_italic_serif');
let baroque = utd.decorate('baroque', 'bold_sans_serif');

console.log(wildScreen + ' ' + baroque);

let nanaDaiba = utd.decorate('Nana Daiba / 倧堎なな (CV: Moeka Koizumi / 小泉萌銙)', 'bold_script');
console.log(nanaDaiba);

䞊蚘コヌドの出力

𝒘𝒊(𝒍)𝒅-𝒔𝒄𝒓𝒆𝒆𝒏 𝗯𝗮𝗿𝗌𝗟𝘂𝗲
𝓝𝓪𝓷𝓪 𝓓𝓪𝓲𝓫𝓪 / 倧堎なな (𝓒𝓥: 𝓜𝓞𝓮𝓎𝓪 𝓚𝓞𝓲𝔃𝓟𝓶𝓲 / 小泉萌銙)

蚘号や非ASCII文字列は無芖されたす。

背景

そもそもこれらの装食文字は䜕のためにあるのでしょうか。
𝐓𝐰𝐢𝐭𝐭𝐞𝐫などの𝕀𝕟𝕥𝕖𝕣𝕟𝕖𝕥をより𝒆𝒙𝒄𝒊𝒕𝒊𝒏𝒈にするため  ではありたせん。これらはMathematical Alphanumeric Symbolsずしお数匏䞭の文字を衚珟するために収録されおいたす。

たずえば 𝐀 (U+1D400)は MATHEMATICAL BOLD CAPITAL A ずいう名称のグリフです。高校数孊でもお銎染みの ℝ (U+211D, DOUBLE-STRUCK CAPITAL R) なども収録されおいたす。たた、𝕬など䞀般的には銎染みがないフラクトゥヌル文字も収録されおいたす。これらは䜍盞などの分野における数匏で䜿甚されるものです。

[泚意点] アクセシビリティ䞊の問題

これらはあくたで数匏を衚珟するための「蚘号」であり、ASCII文字列の代替衚蚘ではありたせん。本質的には別の文字です。こんなラむブラリを䜜っおおいお蚀うのも説埗力がないのですが、アクセシビリティや怜玢性を悪化させる可胜性がありたす。

Google怜玢・Google翻蚳などは以䞋の画像のように通垞のASCII文字に眮換する凊理が走っおいるので気付きにくいのですが、それ以倖の堎面では怜玢やスクリヌンリヌダなどでの挙動に支障が出るず考えられたす。画像: 2022-05-15時点での怜玢結果
image.png

たずえば、DuckDuckGoでは怜玢結果が倉わりたす。画像: 2022-05-15時点での怜玢結果
image.png
image.png

本来の甚途を離れた欧文の衚蚘に関しおは、あくたでお遊びの甚途に留めるのが無難でしょう。本ラむブラリは䞊蚘の泚意事項を螏たえた䞊で利甚されるこずを匷く掚奚したす。

[泚意点] Reservedなコヌドポむントの存圚欠番

これらの文字の倧半はUnicode 3.1で収録されたした。しかしながら、それ以前に䜿甚頻床の高い䞀郚の文字ℂやℝなどはLetterlike Symbolsに収録されおいたす。それらずの重耇を防ぐため、Mathematical Alphanumeric Symbolsではreserved予玄され、欠番ずなっおいる文字がありたす。そのため、コヌドポむントの数倀を蚈算するのみではこれらの欠萜した文字列ぞの察応ができたせん。実際、この欠萜を考慮しおいないため文字化けを匕き起こしおいるラむブラリも存圚したす。

image.png
画像Mathematical Alphanumeric Symbols より

機胜

以䞊の背景を螏たえお、以䞋の芁件を蚭定したした。

  • 耇数の文字皮別に察応する
  • reservedなコヌドポむントにも察応し、文字化けを発生させない
  • 小文字が存圚しない堎合のfallback

小文字が存圚しない堎合のfallback

数孊蚘号ではないのですが、UnicodeにはOther Symbolsずしお 🅐🅑🅒🅓🅔🅕🅖🅗 のような䞞囲みのアルファベット蚘号も存圚しおいたす。本ラむブラリではこれらにも察応しおいたす。

ただ、䞀郚の皮別では倧文字しか蚘号が存圚しおいないものがありたす。これらの倉換を行った時に

Tokyo Tower → 🅣okyo 🅣ower

ずなるのは䞍本意であり、倧文字でも良いので

Tokyo Tower → 🅣🅞🅚🅚🅞 🅣🅞🅊🅔🅡

ずなるべき堎合がありたす。

このラむブラリでは { fallback: true } オプションを枡すこずにより、䞊蚘の動䜜を実珟できたす。

let tokyoTower1 = utd.decorate('Tokyo Tower', 'black_circle'); // デフォルトは false
let tokyoTower2 = utd.decorate('Tokyo Tower', 'black_circle', { fallback: true });
let tokyoTower3 = utd.decorate('Torre de Tóquio','black_circle', { fallback: true });

console.log(tokyoTower1);
console.log(tokyoTower2);
console.log(tokyoTower3);
🅣okyo 🅣ower
🅣🅞🅚🅚🅞 🅣🅞🅊🅔🅡
🅣🅞🅡🅡🅔 🅓🅔 🅣ó🅠🅀🅘🅞

なお。ASCII以倖の文字はfallbackモヌドでも無芖されたす。

  1. Unicode䞊に存圚する別の文字にreplaceしおいるだけであり、フォント曞䜓、タむプフェむスに察する操䜜ではないため、技術的にはこの呌称は䞍正確です。 ↩

28
20
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
28
20