◆ 同じフォントでもコンソールだと罫線が半角なのにエディタにコピペしたら全角になる
  ◆ フォントに文字がなくてだいたいフォントが別になってる?
◆ meiryoke_console や ms gothic (monospace) だと二重罫線にしたら半角表示
◆ consolas は通常の罫線でも半角表示なので consolas 使える環境に限るなら一番良さそう
◆ \u255b がフォントによって罫線の向きが違ってる

┌ とか ┐とかです
前に eshost の記事を書いたときに困ったのですがコンソールでの見た目と それをコピペしてエディタやブラウザでみたときの見た目が違います
罫線の部分がずれています

少し調べてみるとコンソールで使われてる文字は普段から見る全角の ┌ と同じでした
コンソールでは半角になる別の Unicode の文字だけどコピペしたら余計な気遣いで変換されてるのかもと考えたのですがそういうことはないようです
同じ文字なのにコンソールでは横幅が小さく半角サイズで表示されていました

またコンソール上でも半角だったり全角だったりします

CUI エディタの micro で入力したとき

box-drawing02

日本語と同じサイズの全角です

cat でこのテキストファイルを表示すると

box-drawing01

横幅が小さく半角サイズです

よく見てみると micro ではちょっと薄い灰色の線が出来ていて自動で幅を補ってくれてるようにも見えます

フォント?

フォントの問題かとも思ってエディタのフォントをコンソールに合わせたのですが変わりありません
ただ 罫線の線が二重になってる版 ┏ ではエディタでもなぜか半角表示になりました
指定したフォントがないときの自動で選択されるフォントで違ってきている気もします

とりあえず 見た目をあわせるために 二重罫線に変換してみると

box-drawing03


綺麗に揃いました
フォントは meiryoke_console というものなのですが 横線の二重罫線だけ変に目立っていて全体としてはあまり綺麗ではないです
それにこのフォントはすべての人がインストールしてるフォントでもないので揃ってるかどうかが人によって異なります

一応 monospace (Windows の Chrome だと ms gothic) でも二重罫線が半角になりましたけど このフォントは綺麗じゃないのと Windows 以外では半角にならないかもしれません
フォント共通で半角表示する罫線がほしいものです


ところで変換方法はこれに通すだけです
const map = {
"─": "═",
"│": "║",
"┌": "╔",
"┬": "╦",
"┐": "╗",
"├": "╠",
"┼": "╬",
"┤": "╣",
"└": "╚",
"┴": "╩",
"┘": "╝",
}
text.replace(new RegExp(Object.keys(map).join("|"), "g"), e => map[e])

このコードを実行するときに気づいたのですが consolas だと通常の罫線でも半角表示でした

box-drawing04

でも consolas もたしか Windows だけだったと思います
全環境で入っていて同じ幅で表示されるフォントがほしいです

おまけ

罫線を調べているとおかしなものを見つけました
const fonts = [
"cursive",
"sans-serif",
"serif",
"fantasy",
"monospace",
"arial",
"century",
"consolas",
"meiryo",
"meiryo ui",
"yu gothic",
"yu gothic ui",
"courier",
"cambria",
]
const chars = Array.from(Array(30), (e, i) => String.fromCharCode("\u2550".charCodeAt() + i))
const row_tpl = `<tr style="font-family: ###;">${chars.map(e => "<td>" + e + "</td>").join("")}</tr>`
document.body.innerHTML = "<table>" + fonts.map(e => row_tpl.replace(/###/, e)).join("") + "</table>"

横に同じフォント 縦に同じ文字で罫線を表示します

box-drawing06

一見すると何の問題もないのですが 左から 12 番目 \u255b がおかしいです
この文字だけを並べて見ると

const fonts = [
"cursive",
"sans-serif",
"serif",
"fantasy",
"monospace",
"arial",
"century",
"consolas",
"meiryo",
"meiryo ui",
"yu gothic",
"yu gothic ui",
"courier",
"cambria",
]
const span_tpl = `<span style="font-family: ###;">\u255b</span>`
document.body.innerHTML = fonts.map(e => span_tpl.replace(/###/, e)).join("")

box-drawing05

フォントによって文字が違っています
一番多い F を鏡に移したような文字はフォントに対応する文字がないときの表示のようです
monospace は同じ文字ですが よくみると微妙に見た目が違っています

fantasy, arial, century が同じで F を上下に反転させたような文字です
consolas と courier はそれぞれちょっと違いますが fantasy と同じ文字です
周りの並びからするとこっちが正しいようです

いったいどうしてこんなことになってるのでしょうね