Windows“符号”或 WGL4 字体代码指向 UNICODE 映射?

Posted

技术标签:

【中文标题】Windows“符号”或 WGL4 字体代码指向 UNICODE 映射?【英文标题】:Windows "Symbol" or WGL4 font code point to UNICODE map? 【发布时间】:2021-07-10 01:16:54 【问题描述】:

我们使用一些 OCR,如 PDF 到 Word 转换器,这是我们能找到的最好的,但它使用符号字体表,例如度数符号显示为代码点 U+F0B0,它不是有效的 UNICODE点,但它映射到正确的 UNICODE 度码点 U+00B0。事实上,除了一个 Symbol 字体字形之外,所有的符号字体字形都有一个正确的 UNICODE 字符,但我正在努力寻找任何可以显示简单映射的表格。

这个页面http://www.alanwood.net/demos/symbol.html 几乎有它,但它实际上并没有显示符号字体代码点,而是依赖于一些其他映射,坦率地说,我根本不明白。同一个网站有相关页面,但我在任何地方都找不到 F0B0 的学位参考。

我找到了这些特殊字体到旧 groff 缩写的 groff 映射,这是我能得到的最好的,我可以在 symbol.map 找到 F0B0 到缩写“de”的映射,然后我可以在text.map 从 00B0 到“de”的映射。因此,如果我要将这两个文件重塑为关系表,然后加入缩写,我想我可以创建一个映射。

但令我震惊的是,以前没有人必须这样做?有人吗?

【问题讨论】:

我不知道是否有人这样做。在其他方面,有“文本整形”库(一个非常复杂的主题,我们有一个由 Windows 使用,一个由 Mac 使用,还有两个)。简而言之:您无法以简单的方式将字体字形编号(在特定字体上)映射到一个或多个 Unicode 代码点。可能您不需要涵盖 100% 的情况,因此请查看字形并找到最佳 unicode 字符,然后构建您的“异常表”。 符号编码字体可以支持任意字符集,包括非 Unicode 字符。因此,没有任何定义的映射适用于所有符号字体。这就是为什么您会看到使用 U+F0B0 等 Unicode 私有代码点的原因。充其量,如果映射是可能的,它将是特定于字体的;并且字体中的字形总是有可能映射到具有复杂 m:n 映射的 Unicode 字符序列。 【参考方案1】:

嗯,我想我并没有要求关于所有可能的符号字体的第一原则的论文,不,我要求的是 Windows“符号”字体、WGL4 代码页或我认为的任何“Monotype”符号”字体即。

这就是我从问题中指出的这些 groff 字体缩写映射生成映射的方法:

wget https://opensource.apple.com/source/groff/groff-39/groff/font/devlj4/generate/symbol.map
sed -e '/^#/d' -e '/^ *$/d' -e 's/[\t ][\t ]*/|/g' symbol.map |cut -d\| -f2,3 |sort -t\| -k2 >symbol.map.dat
wget https://opensource.apple.com/source/groff/groff-39/groff/font/devlj4/generate/text.map
sed -e '/^#/d' -e '/^ *$/d' -e 's/[\t ][\t ]*/|/g' text.map |cut -d\| -f2,3 |sort -t\| -k2 >text.map.dat
wget https://opensource.apple.com/source/groff/groff-39/groff/font/devlj4/generate/special.map
sed -e '/^#/d' -e '/^ *$/d' -e 's/[\t ][\t ]*/|/g' special.map |cut -d\| -f2,3 |sort -t\| -k2 >special.map.dat
cat text.map.dat special.map.dat |sort -t\| -k2 > unicode.map.dat
join -t\| -1 2 -2 2 symbol.map.dat unicode.map.dat

然后我从中创建一个 XML 映射表,并在我的 XSLT 中使用它:

join -t\| -1 2 -2 2 symbol.map.dat unicode.map.dat |sed -e 's~\([^|]*\)|\([^|]*\)|\([^|]*\)~<a abb="\1" sym="\&#x\2;" uni="\&#x\3;"/>~'

这会创建:

<a abb="" sym="&#xF07C;" uni="&#x2243;"/>
<a abb="!" sym="&#xF021;" uni="&#x0021;"/>
<a abb="!=" sym="&#xF0B9;" uni="&#x2260;"/>
<a abb="#" sym="&#xF023;" uni="&#x0023;"/>
<a abb="%" sym="&#xF025;" uni="&#x0025;"/>
<a abb="&" sym="&#xF026;" uni="&#x0026;"/>
<a abb="(" sym="&#xF028;" uni="&#x0028;"/>
<a abb=")" sym="&#xF029;" uni="&#x0029;"/>
<a abb="**" sym="&#xF02A;" uni="&#x2217;"/>
<a abb="*A" sym="&#xF041;" uni="&#x0041;"/>
<a abb="*B" sym="&#xF042;" uni="&#x0042;"/>
<a abb="*C" sym="&#xF058;" uni="&#x039E;"/>
<a abb="*D" sym="&#xF044;" uni="&#x2206;"/>
<a abb="*E" sym="&#xF045;" uni="&#x0045;"/>
<a abb="*F" sym="&#xF046;" uni="&#x03A6;"/>
<a abb="*G" sym="&#xF047;" uni="&#x0393;"/>
<a abb="*H" sym="&#xF051;" uni="&#x0398;"/>
<a abb="*I" sym="&#xF049;" uni="&#x0049;"/>
<a abb="*K" sym="&#xF04B;" uni="&#x004B;"/>
<a abb="*L" sym="&#xF04C;" uni="&#x039B;"/>
<a abb="*M" sym="&#xF04D;" uni="&#x004D;"/>
<a abb="*N" sym="&#xF04E;" uni="&#x004E;"/>
<a abb="*O" sym="&#xF04F;" uni="&#x004F;"/>
<a abb="*P" sym="&#xF050;" uni="&#x03A0;"/>
<a abb="*Q" sym="&#xF059;" uni="&#x03A8;"/>
<a abb="*R" sym="&#xF052;" uni="&#x0050;"/>
<a abb="*S" sym="&#xF053;" uni="&#x03A3;"/>
<a abb="*T" sym="&#xF054;" uni="&#x0054;"/>
<a abb="*U" sym="&#xF055;" uni="&#x03A5;"/>
<a abb="*W" sym="&#xF057;" uni="&#x03A9;"/>
<a abb="*X" sym="&#xF043;" uni="&#x0058;"/>
<a abb="*Y" sym="&#xF048;" uni="&#x0048;"/>
<a abb="*Z" sym="&#xF05A;" uni="&#x005A;"/>
<a abb="*a" sym="&#xF061;" uni="&#x03B1;"/>
<a abb="*b" sym="&#xF062;" uni="&#x03B2;"/>
<a abb="*c" sym="&#xF078;" uni="&#x03BE;"/>
<a abb="*d" sym="&#xF064;" uni="&#x03B4;"/>
<a abb="*e" sym="&#xF065;" uni="&#xEFEC;"/>
<a abb="*f" sym="&#xF06A;" uni="&#x03C6;"/>
<a abb="*g" sym="&#xF067;" uni="&#x03B3;"/>
<a abb="*h" sym="&#xF071;" uni="&#x03B8;"/>
<a abb="*i" sym="&#xF069;" uni="&#x03B9;"/>
<a abb="*k" sym="&#xF06B;" uni="&#x03BA;"/>
<a abb="*l" sym="&#xF06C;" uni="&#x03BB;"/>
<a abb="*m" sym="&#xF06D;" uni="&#x03BC;"/>
<a abb="*n" sym="&#xF06E;" uni="&#x03BD;"/>
<a abb="*o" sym="&#xF06F;" uni="&#x03BF;"/>
<a abb="*p" sym="&#xF070;" uni="&#x03C0;"/>
<a abb="*q" sym="&#xF079;" uni="&#x03C8;"/>
<a abb="*r" sym="&#xF072;" uni="&#x03C1;"/>
<a abb="*s" sym="&#xF073;" uni="&#x03C3;"/>
<a abb="*t" sym="&#xF074;" uni="&#x03C4;"/>
<a abb="*u" sym="&#xF075;" uni="&#x03C5;"/>
<a abb="*w" sym="&#xF077;" uni="&#x03C9;"/>
<a abb="*x" sym="&#xF063;" uni="&#x03C7;"/>
<a abb="*y" sym="&#xF068;" uni="&#x03B7;"/>
<a abb="*z" sym="&#xF07A;" uni="&#x03B6;"/>
<a abb="+-" sym="&#xF0B1;" uni="&#x00B1;"/>
<a abb="+f" sym="&#xF066;" uni="&#x03D5;"/>
<a abb="+h" sym="&#xF04A;" uni="&#x03D1;"/>
<a abb="+p" sym="&#xF076;" uni="&#x03D6;"/>
<a abb="," sym="&#xF02C;" uni="&#x002C;"/>
<a abb="->" sym="&#xF0AE;" uni="&#x2192;"/>
<a abb="." sym="&#xF02E;" uni="&#x002E;"/>
<a abb="/" sym="&#xF02F;" uni="&#x002F;"/>
<a abb="/_" sym="&#xF0D0;" uni="&#x2220;"/>
<a abb="0" sym="&#xF030;" uni="&#x0030;"/>
<a abb="1" sym="&#xF031;" uni="&#x0031;"/>
<a abb="2" sym="&#xF032;" uni="&#x0032;"/>
<a abb="3" sym="&#xF033;" uni="&#x0033;"/>
<a abb="3d" sym="&#xF05C;" uni="&#x2234;"/>
<a abb="4" sym="&#xF034;" uni="&#x0034;"/>
<a abb="5" sym="&#xF035;" uni="&#x0035;"/>
<a abb="6" sym="&#xF036;" uni="&#x0036;"/>
<a abb="7" sym="&#xF037;" uni="&#x0037;"/>
<a abb="8" sym="&#xF038;" uni="&#x0038;"/>
<a abb="9" sym="&#xF039;" uni="&#x0039;"/>
<a abb=":" sym="&#xF03A;" uni="&#x003A;"/>
<a abb=";" sym="&#xF03B;" uni="&#x003B;"/>
<a abb="<" sym="&#xF03C;" uni="&#x003C;"/>
<a abb="<-" sym="&#xF0AC;" uni="&#x2190;"/>
<a abb="<=" sym="&#xF0A3;" uni="&#x2264;"/>
<a abb="<>" sym="&#xF0AB;" uni="&#x2194;"/>
<a abb="=" sym="&#xF03D;" uni="&#x003D;"/>
<a abb="==" sym="&#xF0BA;" uni="&#x2261;"/>
<a abb="=~" sym="&#xF040;" uni="&#x2245;"/>
<a abb=">" sym="&#xF03E;" uni="&#x003E;"/>
<a abb=">=" sym="&#xF0B3;" uni="&#x2265;"/>
<a abb="?" sym="&#xF03F;" uni="&#x003F;"/>
<a abb="AN" sym="&#xF0D9;" uni="&#x2227;"/>
<a abb="Ah" sym="&#xF0C0;" uni="&#x2135;"/>
<a abb="CL" sym="&#xF0A7;" uni="&#x2663;"/>
<a abb="CR" sym="&#xF0BF;" uni="&#x21B5;"/>
<a abb="DI" sym="&#xF0A8;" uni="&#x2666;"/>
<a abb="Eu" sym="&#xF0F0;" uni="&#x20AC;"/>
<a abb="HE" sym="&#xF0A9;" uni="&#x2665;"/>
<a abb="Im" sym="&#xF0C1;" uni="&#x2111;"/>
<a abb="OR" sym="&#xF0DA;" uni="&#x2228;"/>
<a abb="Re" sym="&#xF0C2;" uni="&#x211C;"/>
<a abb="SP" sym="&#xF0AA;" uni="&#x2660;"/>
<a abb="[" sym="&#xF05B;" uni="&#x005B;"/>
<a abb="]" sym="&#xF05D;" uni="&#x005D;"/>
<a abb="_" sym="&#xF05F;" uni="&#x005F;"/>
<a abb="ap" sym="&#xF07E;" uni="&#x007E;"/>
<a abb="arrowvertbt" sym="&#xF0DF;" uni="&#x21D3;"/>
<a abb="arrowverttp" sym="&#xF0DD;" uni="&#x21D1;"/>
<a abb="c*" sym="&#xF0C4;" uni="&#x2297;"/>
<a abb="c+" sym="&#xF0C5;" uni="&#x2295;"/>
<a abb="ca" sym="&#xF0C7;" uni="&#x2229;"/>
<a abb="cu" sym="&#xF0C8;" uni="&#x222A;"/>
<a abb="da" sym="&#xF0AF;" uni="&#x2193;"/>
<a abb="de" sym="&#xF0B0;" uni="&#x00B0;"/>
<a abb="di" sym="&#xF0B8;" uni="&#x00F7;"/>
<a abb="es" sym="&#xF0C6;" uni="&#x2205;"/>
<a abb="f/" sym="&#xF0A4;" uni="&#x2215;"/>
<a abb="fa" sym="&#xF022;" uni="&#x2200;"/>
<a abb="fm" sym="&#xF0A2;" uni="&#x2032;"/>
<a abb="gr" sym="&#xF0D1;" uni="&#x2207;"/>
<a abb="hA" sym="&#xF0DB;" uni="&#x21D4;"/>
<a abb="ib" sym="&#xF0CD;" uni="&#x2286;"/>
<a abb="if" sym="&#xF0A5;" uni="&#x221E;"/>
<a abb="integral" sym="&#xF0F2;" uni="&#x222B;"/>
<a abb="ip" sym="&#xF0CA;" uni="&#x2287;"/>
<a abb="lA" sym="&#xF0DC;" uni="&#x21D0;"/>
<a abb="la" sym="&#xF0E1;" uni="&#x2329;"/>
<a abb="lz" sym="&#xF0E0;" uni="&#x25C7;"/>
<a abb="mi" sym="&#xF02D;" uni="&#x2212;"/>
<a abb="mo" sym="&#xF0CE;" uni="&#x2208;"/>
<a abb="mu" sym="&#xF0B4;" uni="&#x00D7;"/>
<a abb="nb" sym="&#xF0CB;" uni="&#x2284;"/>
<a abb="nm" sym="&#xF0CF;" uni="&#x2209;"/>
<a abb="no" sym="&#xF0D8;" uni="&#x00AC;"/>
<a abb="pd" sym="&#xF0B6;" uni="&#x2202;"/>
<a abb="pl" sym="&#xF02B;" uni="&#x002B;"/>
<a abb="pp" sym="&#xF05E;" uni="&#x22A5;"/>
<a abb="product" sym="&#xF0D5;" uni="&#x220F;"/>
<a abb="pt" sym="&#xF0B5;" uni="&#x221D;"/>
<a abb="rA" sym="&#xF0DE;" uni="&#x21D2;"/>
<a abb="ra" sym="&#xF0F1;" uni="&#x232A;"/>
<a abb="sb" sym="&#xF0CC;" uni="&#x2282;"/>
<a abb="sd" sym="&#xF0B2;" uni="&#x2033;"/>
<a abb="sp" sym="&#xF0C9;" uni="&#x2283;"/>
<a abb="st" sym="&#xF027;" uni="&#x220D;"/>
<a abb="sum" sym="&#xF0E5;" uni="&#x2211;"/>
<a abb="te" sym="&#xF024;" uni="&#x2203;"/>
<a abb="ts" sym="&#xF056;" uni="&#x03C2;"/>
<a abb="u2026" sym="&#xF0BC;" uni="&#x2026;"/>
<a abb="u2320" sym="&#xF0F3;" uni="&#x2320;"/>
<a abb="u2321" sym="&#xF0F5;" uni="&#x2321;"/>
<a abb="ua" sym="&#xF0AD;" uni="&#x2191;"/>
<a abb="wp" sym="&#xF0C3;" uni="&#x2118;"/>
<a abb="~=" sym="&#xF0BB;" uni="&#x2248;"/>

或者我也可以创建这些无效 UNICODE 点的查找字符串和位置匹配的正确 UNICODE 点的字符串:

join -t\| -1 2 -2 2 symbol.map.dat unicode.map.dat |sed -e 's~\([^|]*\)|\([^|]*\)|\([^|]*\)~\1|\&#x\2;|\&#x\3;~' > symbol-unicode.map.dat
echo '<a sym="'$(cut -d\| -f2 symbol-unicode.map.dat |tr -d '\n')'" uni="'$(cut -d\| -f3 symbol-unicode.map.dat |tr -d '\n')'"/>'

这给了我:

<a sym="&#xF07C;&#xF021;&#xF0B9;&#xF023;&#xF025;&#xF026;&#xF028;&#xF029;&#xF02A;&#xF041;&#xF042;&#xF058;&#xF044;&#xF045;&#xF046;&#xF047;&#xF051;&#xF049;&#xF04B;&#xF04C;&#xF04D;&#xF04E;&#xF04F;&#xF050;&#xF059;&#xF052;&#xF053;&#xF054;&#xF055;&#xF057;&#xF043;&#xF048;&#xF05A;&#xF061;&#xF062;&#xF078;&#xF064;&#xF065;&#xF06A;&#xF067;&#xF071;&#xF069;&#xF06B;&#xF06C;&#xF06D;&#xF06E;&#xF06F;&#xF070;&#xF079;&#xF072;&#xF073;&#xF074;&#xF075;&#xF077;&#xF063;&#xF068;&#xF07A;&#xF0B1;&#xF066;&#xF04A;&#xF076;&#xF02C;&#xF0AE;&#xF02E;&#xF02F;&#xF0D0;&#xF030;&#xF031;&#xF032;&#xF033;&#xF05C;&#xF034;&#xF035;&#xF036;&#xF037;&#xF038;&#xF039;&#xF03A;&#xF03B;&#xF03C;&#xF0AC;&#xF0A3;&#xF0AB;&#xF03D;&#xF0BA;&#xF040;&#xF03E;&#xF0B3;&#xF03F;&#xF0D9;&#xF0C0;&#xF0A7;&#xF0BF;&#xF0A8;&#xF0F0;&#xF0A9;&#xF0C1;&#xF0DA;&#xF0C2;&#xF0AA;&#xF05B;&#xF05D;&#xF05F;&#xF07E;&#xF0DF;&#xF0DD;&#xF0C4;&#xF0C5;&#xF0C7;&#xF0C8;&#xF0AF;&#xF0B0;&#xF0B8;&#xF0C6;&#xF0A4;&#xF022;&#xF0A2;&#xF0D1;&#xF0DB;&#xF0CD;&#xF0A5;&#xF0F2;&#xF0CA;&#xF0DC;&#xF0E1;&#xF0E0;&#xF02D;&#xF0CE;&#xF0B4;&#xF0CB;&#xF0CF;&#xF0D8;&#xF0B6;&#xF02B;&#xF05E;&#xF0D5;&#xF0B5;&#xF0DE;&#xF0F1;&#xF0CC;&#xF0B2;&#xF0C9;&#xF027;&#xF0E5;&#xF024;&#xF056;&#xF0BC;&#xF0F3;&#xF0F5;&#xF0AD;&#xF0C3;&#xF0BB;" 
   uni="&#x2243;&#x0021;&#x2260;&#x0023;&#x0025;&#x0026;&#x0028;&#x0029;&#x2217;&#x0041;&#x0042;&#x039E;&#x2206;&#x0045;&#x03A6;&#x0393;&#x0398;&#x0049;&#x004B;&#x039B;&#x004D;&#x004E;&#x004F;&#x03A0;&#x03A8;&#x0050;&#x03A3;&#x0054;&#x03A5;&#x03A9;&#x0058;&#x0048;&#x005A;&#x03B1;&#x03B2;&#x03BE;&#x03B4;&#xEFEC;&#x03C6;&#x03B3;&#x03B8;&#x03B9;&#x03BA;&#x03BB;&#x03BC;&#x03BD;&#x03BF;&#x03C0;&#x03C8;&#x03C1;&#x03C3;&#x03C4;&#x03C5;&#x03C9;&#x03C7;&#x03B7;&#x03B6;&#x00B1;&#x03D5;&#x03D1;&#x03D6;&#x002C;&#x2192;&#x002E;&#x002F;&#x2220;&#x0030;&#x0031;&#x0032;&#x0033;&#x2234;&#x0034;&#x0035;&#x0036;&#x0037;&#x0038;&#x0039;&#x003A;&#x003B;&#x003C;&#x2190;&#x2264;&#x2194;&#x003D;&#x2261;&#x2245;&#x003E;&#x2265;&#x003F;&#x2227;&#x2135;&#x2663;&#x21B5;&#x2666;&#x20AC;&#x2665;&#x2111;&#x2228;&#x211C;&#x2660;&#x005B;&#x005D;&#x005F;&#x007E;&#x21D3;&#x21D1;&#x2297;&#x2295;&#x2229;&#x222A;&#x2193;&#x00B0;&#x00F7;&#x2205;&#x2215;&#x2200;&#x2032;&#x2207;&#x21D4;&#x2286;&#x221E;&#x222B;&#x2287;&#x21D0;&#x2329;&#x25C7;&#x2212;&#x2208;&#x00D7;&#x2284;&#x2209;&#x00AC;&#x2202;&#x002B;&#x22A5;&#x220F;&#x221D;&#x21D2;&#x232A;&#x2282;&#x2033;&#x2283;&#x220D;&#x2211;&#x2203;&#x03C2;&#x2026;&#x2320;&#x2321;&#x2191;&#x2118;&#x2248;">

顺便说一句,Stack Exchange 平台有一个有趣的地方,我可以向您展示我在这里的符号,首先是坏的,它可能会全部显示为框,除非您调整本地 CSS @987654328 @:

   

现在是 UNIICODE 字符串:

≃!≠#%&()∗ABΞ∆EΦΓΘIKΛMNOΠΨPΣTΥΩXHZαβξδφγθικλμνοπψρστυωχηζ±φϑϖ,→./∠0123∴456789:;≥?∧ℵ♣↨↵♦€♥ℑℨ↨↵€♥ []_~⇓⇑⊗⊕∩∪↓°÷∅∕∀′∇⇔⊆∞∫⊇⇐〈◇−∈×⊄∉¬∂+⊥∏∝⇒〉⊂″⊃∍∑∃ς…⌠⌡↑ ℘≈

很漂亮。

也许它可以帮助其他需要快速实用解决方案的相同问题的人。不客气。

【讨论】:

我将添加一条评论,指出我的结果中的错误,除了由于 abb 属性值导致的映射元素中的一些 XML 格式正确问题,我们看到希腊 epsilon ε 没有出来,&amp;#xEFEC; 应该是&amp;#x03B5;。第一个字符也是错误的,想知道我的管道分隔符是否导致了这种情况。但足够公平。

以上是关于Windows“符号”或 WGL4 字体代码指向 UNICODE 映射?的主要内容,如果未能解决你的问题,请参考以下文章

如何解决MathType缺少MT Extra字体问题

wingdings这个字体怎么读

如何在网站上使用表情符号字体?

如何解决MathType缺少MT Extra字体问题

windows10,解决jmeter5.2.1版本界面字体过小问题

结构图中字体标注样式有何规定