字体違いの名前合わせ
日本語の画面の名前を、簡体字のデータの名前に突き合わせるときの手順。
opencc-js の jp → cn 変換を1回通すだけでは、合わない名前が出る。ゲームの武将の名前を取り込んだとき、6件が合わなかった。
起きること
画面の名前を変換して、データの名前と文字列が同じか調べる。
| 画面の名前 | 変換後 | データの名前 | 結果 |
|---|---|---|---|
| 趙雲 | 赵云 | 赵云 | 一致 |
| 劉備 | 刘备 | 刘备 | 一致 |
| 曹操 | 曹操 | 曹操 | 一致 |
| 諸葛亮 | 诸葛亮 | 诸葛亮 | 一致 |
| 蔡文姫 | 蔡文姫 | 蔡文姬 | 不一致 |
| 馬雲騄 | 马云(U+2B627) | 马云禄 | 不一致 |
| 衛瓘 | 衞瓘 | 卫瓘 | 不一致 |
| 呂姫 | 吕姫 | 吕姬 | 不一致 |
| 張姫 | 张姫 | 张姬 | 不一致 |
| 周姫 | 周姫 | 周姬 | 不一致 |
上の表は、取り込みのとき合わなかった6件と、最初から合っていた4件(対照)を、2026-11-10にゲームの武将データ(171人)で流し直した結果。
原因は3つの字だけ
違っていたのは、次の3つの字だった。見た目はほぼ同じなので、文字コードを並べて初めて分かる。
手順
- 画面の名前を、
jp → cnで1回変換する - データの名前と一致するか調べる。一致しない名前だけを集める
- 集めた名前の文字コードを並べ、データの名前の字と見比べる
- 違う字を見つけたら、変換のあとに置換を足す
- 足したあと、最初から一致していた名前も流し直す。置換が合っていた名前を壊していないか見るためである
- データに無い名前は、近い名前に寄せずに入れない
変換の書き方
import * as OpenCC from "opencc-js";
const toCn = OpenCC.Converter({ from: "jp", to: "cn" });
const fix = (s) =>
s.replaceAll("姫", "姬").replaceAll("衞", "卫").replaceAll("\u{2B627}", "禄");
const match = (name) => fix(toCn(name));
U+2B627 の字は、環境によっては表示されないことがある。コードでは文字そのものでなく、コードポイントで書く。
この置換で、上の6件はすべてデータと一致した。最初から合っていた4件も、一致のままだった。
注意
- 確かめたのは10件(合わなかった6件と、対照の4件)。 武将171人の全員で、置換が足りるかは調べていない。人数が増えたら、一致しなかった名前を同じ手順で集める
- 名前が合っても、1人に決まるとは限らない。 蔡文姬はデータに2件(100004と102011)、周姬も2件(100032と102017)ある。同名の版が複数あるときは、コストや兵種など、名前以外で選ぶ
- データに無い名前は入れない。 近い名前に寄せると、別の人の持ち物になる
関連
- ゲーム画面33枚をJSONにした — この手順を使った経緯と、取り込みを2回流して確かめた結果
- JSONの返事を受け取る型 — 外から来たJSONを、形で検査してから使う考え方
- ガードが素通りする書き方 — 検査が効いていないことを、壊して確かめる手順
- 作っているもの — 開発日記の元になっているプロダクト