星座符号计算器

输入出生月日,给出对应星座的 Unicode 符号与码位,并列出十二星座 U+2648~U+2653、蛇夫座 U+26CE 以及十个行星符号的十进制实体、UTF-8 字节数和本机字体覆盖情况。

提示:月份或日期输入框里按 Enter 可直接重算。上面这批卡片就是 10 月 1 日的默认结果,重算后内容会就地更新。

使用方法

  1. 在「出生月份」填 10、「出生日期」填 1(示例值,即 10 月 1 日)。月份允许 1~12 的整数,日期允许 1~31 的整数;2 月按闰年放宽到 29 日,平年填 2 月 30 日会被拒绝。
  2. 「星座口径」默认选「西方占星 12 宫」——这是应用最广的一套固定边界。想按国际天文学联合会 1930 年划定的星座边界算,就切到「IAU 13 星座(含蛇夫座,近似)」。
  3. 在输入框里直接按 Enter,或点「换算星座符号」。结果区会给出星座名、符号字形、码点 U+264E、十进制实体 ♎、十六进制实体 ♎、UTF-8 三字节 E2 99 8E、UTF-16 码元数 1、日期区间与四元素。
  4. 要往 HTML、Word、SQL 或 JSON 里塞符号,优先复制「十进制实体」那一格。它全是 ASCII 字符,不依赖文件编码,任何环节都不会被转成问号。
  5. 点「本机字体覆盖自检」,工具会用 canvas 逐个绘制十二星座符号与蛇夫座,屏幕上画不出来的会被点名,直接告诉你是哪一个缺字。
  6. 下方「星座与占星符号对照表」共 24 行,先显示 12 行,点「加载更多」再展开 12 行;「导出 CSV」带 BOM 可以直接用 Excel 打开,「复制对照表」复制的是制表符分隔的 TSV。
  7. 点「重置为默认示例」可以随时回到 10 月 1 日这组默认值。

这个星座符号计算器能解决什么问题

一是把符号安全地带出这个页面。星座符号属于符号类字符,直接在聊天窗口里复制走通常没问题,但一旦落到 Excel 单元格、CSV 文件、Word 域代码或数据库的 latin1 字段里,就经常变成 ? 或者空白。本页同时给出十进制实体与十六进制实体两种写法,SQL 里可以写 CHAR(9806),HTML 里写 ♎,CSV 导出时勾 UTF-8 BOM,整条链路都不会掉字。

二是定位「同一个符号,别人能看到我看不到」。星座符号的显示取决于系统里装了哪个字体,而不取决于网页本身。同样是 U+26CE,Windows 的 Segoe UI Symbol、macOS 的 Apple Symbols、Android 的 Noto Sans Symbols 2 覆盖情况并不一致,中文宋体一类字库甚至完全不收录。本页把十二星座符号与蛇夫座的码位摆在一起,再用 canvas 实测本机能不能画出来,缺字问题当场就能确认。

三是把生日换算成符号,并且知道换算口径。占星网站上 4 月 19 日有的写白羊、有的写金牛,不是谁算错了,而是用了不同的边界表。本页把 12 宫固定边界与 IAU 近似边界并列,同一个生日在两套口径下会落到哪个星座,一眼能看出来。

四是开发与排版时取准确字节。写正则、建索引、估字符宽度、算字段长度时,需要知道 U+2648 在 UTF-8 里占 3 字节、在 UTF-16 里占 1 个码元。数据库字段按字节算长度时,一个星座符号要预留 3 个字节而不是 1 个。

本页不做这些事:不算上升星座与月亮星座,不排星盘,不查行星位置,也不做任何命理预测。它只回答「这个日期对应哪个星座符号、这个符号的码位是多少、你的机器能不能显示它」。想看天象与历法,请用页面底部的「二十四节气查询」和「月相阶段计算器」。

原理:码位、字符引用与字体覆盖

调用的函数很少。这个星座符号计算器没有用任何三角函数,也没有天文算法库:它只用 String.prototype.codePointAt(0) 读出符号的码位,用内置的 String.fromCodePoint() 反向拼出字符,再用一段手写的 UTF-8 编码器按位拆分字节。UTF-8 的三字节模板是 1110xxxx 10xxxxxx 10xxxxxx:把码位右移 12 位与 0xE0 做或运算得到首字节,右移 6 位取低 6 位与 0x80 做或运算得到第二字节,低 6 位与 0x80 或运算得到第三字节。

为什么符号表按码位硬编码,而不是按名称匹配。十二星座符号的写法在各处并不统一:aries、Aries、白羊座、牡羊座 都指同一个符号。名称会变、会翻译、会拼错,唯一稳定的是码位。本页把所有符号按 U+2648 起的连续码位写死,任何输入都只做一次边界比较,不做字符串匹配,因此不会因为输入了繁体或日文名称而失配。

遵循的标准。码位分区依据 Unicode 标准:十二星座符号位于「杂项符号」区 U+2600–U+26FF,从 Unicode 1.1 起就有,码位是 U+2648 到 U+2653 十二个连续值;蛇夫座 U+26CE 是 Unicode 6.0(2010 年)才补进去的,整整晚了十七年,这正是它字体覆盖差得多的根本原因。字符引用写法依据 HTML 标准:♈ 是十进制形式,♈ 是十六进制形式,两种都合法,但结尾的分号不能省。

输入怎么变成输出。月份与日期先合成一个整数 M × 100 + D(10 月 1 日就是 1001),再与十二段边界依次比较。命中第 n 段,码位就是 0x2648 + (n − 1)。10 月 1 日落在 923 ≤ 1001 ≤ 1023 这一段,也就是天秤座,0x2648 + 6 = 0x264E,十进制 9806,UTF-8 就是 E2 99 8E。用 0x2648 起步而不是从 1 开始数,是为了让「第几个星座」与「第几个码位」始终一一对应,改边界表时不会错位。

边界与阈值都是具体数字。码位区间 U+2648(十进制 9800)到 U+2653(十进制 9811),共 12 个连续码位;蛇夫座 U+26CE(十进制 9934)与双鱼座相隔 123 个码位,所以它没法靠「加 1」推出来,必须单独列一行。这些码位全部落在 U+0800–U+FFFF 区间,因此 UTF-8 一律 3 字节、UTF-16 一律 1 个码元。十二宫的日期边界逐日累加,平年合计正好 365 天、闰年 366 天,段与段之间没有空隙也没有重叠——只有双鱼座会随闰年从 30 天变成 31 天。

常见误用要纠正两条。第一,把 UTF-16 的 length 当字节数用:星座符号的 length 是 1,但它在 UTF-8 里是 3 个字节,按字节限长的字段只给 1 个字节就会写不进去。第二,以为符号一定是黑白文字:十二星座符号在 Unicode 的 emoji 数据里被标为默认彩色呈现,在装了彩色 emoji 字体的系统上会画成彩色小图,宽度和基线都与黑白字形不同,排版时要当成 emoji 而不是普通字母处理。

完整示例(以默认的 10 月 1 日为例)

页面打开时的默认值是 月份 10、日期 1、口径「西方占星 12 宫」,与结果卡片、对照表里的数字完全对应,这也是这个星座符号计算器唯一一处「三处咬合」的示例值。换算过程拆开是这样:

如果切到「IAU 13 星座」,同一个 10 月 1 日会落到处女座——它在那一套里的区间是 9/16–10/30,共 45 天;而天秤座在那套里只剩 10/31–11/22,共 23 天。日期没变,归属变了,这就是两套口径最直观的差别。想自己验证,把下拉框切到 13 星座再看一次结果即可。

符号码点表与两套日期口径

下面这张表把十二星座符号、蛇夫座和十个占星行星符号放在一起,共 24 行。默认只显示前 12 行(十二星座),点「加载更多」展开其余 12 行。每一行的码点、实体和字节都是从符号本身算出来的,可以用 codePointAt 自行复核。

符号名称码点十进制实体十六进制实体UTF-8 字节UTF-16 码元Emoji 呈色
♈白羊座U+2648♈♈E2 99 881是
♉金牛座U+2649♉♉E2 99 891是
♊双子座U+264A♊♊E2 99 8A1是
♋巨蟹座U+264B♋♋E2 99 8B1是
♌狮子座U+264C♌♌E2 99 8C1是
♍处女座U+264D♍♍E2 99 8D1是
♎天秤座U+264E♎♎E2 99 8E1是
♏天蝎座U+264F♏♏E2 99 8F1是
♐射手座U+2650♐♐E2 99 901是
♑摩羯座U+2651♑♑E2 99 911是
♒水瓶座U+2652♒♒E2 99 921是
♓双鱼座U+2653♓♓E2 99 931是
⛎蛇夫座U+26CE⛎⛎E2 9B 8E1是
☉太阳U+2609☉☉E2 98 891否
☽月亮U+263D☽☽E2 98 BD1否
☿水星U+263F☿☿E2 98 BF1否
♀金星U+2640♀♀E2 99 801是
♁地球U+2641♁♁E2 99 811否
♂火星U+2642♂♂E2 99 821是
♃木星U+2643♃♃E2 99 831否
♄土星U+2644♄♄E2 99 841否
♅天王星U+2645♅♅E2 99 851否
♆海王星U+2646♆♆E2 99 861否
♇冥王星U+2647♇♇E2 99 871否

下面这张表按日历顺序排列,把两套口径并排放。左半边是西方占星的十二宫固定边界,右半边是 IAU 1930 边界对应的 13 星座近似区间。注意蛇夫座只出现在右边:它在 12 宫体系里根本不存在。

星座符号12 宫区间平年天数闰年天数IAU 13 星座近似区间
摩羯座♑12/22–1/1929291/20–2/15
水瓶座♒1/20–2/1830302/16–3/11
双鱼座♓2/19–3/2030313/12–4/18
白羊座♈3/21–4/1930304/19–5/13
金牛座♉4/20–5/2031315/14–6/20
双子座♊5/21–6/2132326/21–7/20
巨蟹座♋6/22–7/2231317/21–8/9
狮子座♌7/23–8/2231318/10–9/15
处女座♍8/23–9/2231319/16–10/30
天秤座♎9/23–10/23313110/31–11/22
天蝎座♏10/24–11/22303011/23–11/29
蛇夫座⛎———11/30–12/17
射手座♐11/23–12/21292912/18–1/19

两张表连起来看能看出三点:一是十二星座符号的码位完全连续,从 9800 到 9811 一个不差;二是天数合计恰好是 365 天(闰年 366 天),说明这套边界既没有留空也没有互相盖住;三是 IAU 那套的段长非常不均匀,最短的天蝎座只有 7 天,最长的处女座有 45 天,差了六倍多——因为它按的是天区实际大小,不是按月相平分的。蛇夫座在这套里横跨 18 天。

输入范围、边界与精度说明

常见问题

为什么十二星座符号是连续的 U+2648~U+2653,蛇夫座却跳到 U+26CE?

因为它们是两次不同的编码决定。十二星座符号从 Unicode 1.1(1993 年)起就被整段收进「杂项符号」区,排在一起是十二个连续码位,十进制从 9800 到 9811。蛇夫座 U+26CE 是 2010 年 Unicode 6.0 才补进去的,那时 U+2654 之后的码位已经用掉了,只能在后排找位置,于是落在了 U+26CE,十进制 9934,与双鱼座相隔 123 个码位。这也是它字体支持差得多的原因——晚了十七年。

HTML 里直接写符号和写 ♈ 有什么区别?

显示效果一样,稳定性不一样。直接写字符要求整个文件从磁盘到服务器到浏览器都用同一套编码(UTF-8),中间任何一环按别的编码解析就会变乱码。写实体 ♈ 则全是 ASCII 字符,不管文件编码是什么都能正确解析出白羊座符号。在邮件模板、老系统、数据库导出脚本里,实体写法明显更保险。

我的生日在交界日,为什么这里算出来的和别的网站不一样?

因为两套边界表不一样。占星站普遍用固定的十二宫边界,本页 12 宫模式用的就是这一套;而天文口径按 1930 年 IAU 天区边界算,会把 11 月 30 日到 12 月 17 日划给蛇夫座,段长也极不均匀。真正落在交界日(例如 4 月 19 日、10 月 23 日、12 月 21 日)时,不同表差一天就会换星座。本页把两套并排给出,你可以直接对照着看差异,而不是怀疑哪边算错了。

♈ 和 ♈ 哪个更好?结尾分号能省吗?

两种写法等价,♈ 是十进制,♈ 是十六进制,浏览器解析结果完全相同、字节数也一样。选哪种看上下文:写 CSS 的 content 属性用十六进制更常见,因为在 CSS 里十六进制转义本来就要用反斜杠加码位(写法是 \2648,注意在 CSS 里没有结尾分号的概念,要用空格隔开后面的内容);写 SQL 用十进制更方便(CHAR(9806))。分号绝对不能省:&#9800 后面如果紧跟数字或字母,浏览器会把它当成更长的数字继续解析,结果跑到别的字符上去。

为什么有些字体里 ♈ 能显示,⛎ 却是方框?

因为两者的收录年份差了十七年。大多数中文字库和系统字体在 2010 年之前就定型了,里面没有 U+26CE 的字形;U+2648 这类 1993 年就存在的符号则早在覆盖范围内。显示方框(豆腐块)表示字体缺字,浏览器也没有找到能回退的字体。点一下「本机字体覆盖自检」就能确认你机器上到底是哪一个缺,缺哪个再考虑换成 Noto Sans Symbols 2 之类覆盖更全的字体。

符号跑到 Excel 或数据库里变成问号,怎么修?

按三步排查:第一,导出时选 UTF-8 而不是 ANSI 或 GBK,本页的「导出 CSV」自带 BOM,Excel 双击打开不会乱码;第二,确认目标列的字符集,MySQL 的 utf8 只支持三字节,星座符号正好是三字节还能装下,但同表里如果有更长的字符就会报错,建议统一用 utf8mb4;第三,确认字段长度按字符还是按字节算,U+2648 在 UTF-8 里占 3 字节,按字节限长时要留够 3 个字节的位置。

♎ 和 ♎︎ 看起来一样,为什么要区分?

区别在有没有跟着变体选择符。U+FE0F 是彩色呈现选择符,加在符号后面表示「请用 emoji 字形画」;U+FE0E 是文字呈现选择符,表示「请用黑白字形画」。十二星座符号在 Unicode 数据里被标为默认彩色呈现,所以在装了彩色 emoji 字体的设备上,不加后缀也会画成彩色。彩色字形的字面宽度和基线常常和黑白字形不同,做定宽表格或对齐排版时,可以在符号后面补一个 U+FE0E 把呈现方式钉死。

自检显示全部可绘制,是不是就代表别人也能看到?

不代表。自检只测你自己这台机器、这个浏览器、当前字体栈。它有意义的地方在于区分「我这边缺字」和「对方那边缺字」:如果自检显示缺字,问题就在你本机,装一套覆盖更全的字体即可;如果自检全通过但同事看到方框,那就是对方的机器缺字。这也说明网页本身没错,符号的码位一直都完整地写在 HTML 里。

相关工具