使用方法
- 在「出生月份」填 10、「出生日期」填 1(示例值,即 10 月 1 日)。月份允许 1~12 的整数,日期允许 1~31 的整数;2 月按闰年放宽到 29 日,平年填 2 月 30 日会被拒绝。
- 「星座口径」默认选「西方占星 12 宫」——这是应用最广的一套固定边界。想按国际天文学联合会 1930 年划定的星座边界算,就切到「IAU 13 星座(含蛇夫座,近似)」。
- 在输入框里直接按 Enter,或点「换算星座符号」。结果区会给出星座名、符号字形、码点
U+264E、十进制实体♎、十六进制实体♎、UTF-8 三字节E2 99 8E、UTF-16 码元数1、日期区间与四元素。 - 要往 HTML、Word、SQL 或 JSON 里塞符号,优先复制「十进制实体」那一格。它全是 ASCII 字符,不依赖文件编码,任何环节都不会被转成问号。
- 点「本机字体覆盖自检」,工具会用 canvas 逐个绘制十二星座符号与蛇夫座,屏幕上画不出来的会被点名,直接告诉你是哪一个缺字。
- 下方「星座与占星符号对照表」共 24 行,先显示 12 行,点「加载更多」再展开 12 行;「导出 CSV」带 BOM 可以直接用 Excel 打开,「复制对照表」复制的是制表符分隔的 TSV。
- 点「重置为默认示例」可以随时回到 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 宫」,与结果卡片、对照表里的数字完全对应,这也是这个星座符号计算器唯一一处「三处咬合」的示例值。换算过程拆开是这样:
- 合成整数
10 × 100 + 1 = 1001; - 依次比较十二段边界,落在天秤座那一段
923 ≤ 1001 ≤ 1023; - 天秤座在表里排第 7 位,码位
0x2648 + 6 = 0x264E,十进制9806; - 十进制实体
♎,十六进制实体♎; - UTF-8 三字节
E2 99 8E(把9806写成二进制0010 0110 0100 1110后按 4-6-6 位拆分得到); - UTF-16 码元数
1,因为它落在基本多文种平面; - 日期区间
9/23–10/23,平年闰年都是 31 天; - 四元素归为风(双子、天秤、水瓶同属风象)。
如果切到「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 88 | 1 | 是 |
| ♉ | 金牛座 | U+2649 | ♉ | ♉ | E2 99 89 | 1 | 是 |
| ♊ | 双子座 | U+264A | ♊ | ♊ | E2 99 8A | 1 | 是 |
| ♋ | 巨蟹座 | U+264B | ♋ | ♋ | E2 99 8B | 1 | 是 |
| ♌ | 狮子座 | U+264C | ♌ | ♌ | E2 99 8C | 1 | 是 |
| ♍ | 处女座 | U+264D | ♍ | ♍ | E2 99 8D | 1 | 是 |
| ♎ | 天秤座 | U+264E | ♎ | ♎ | E2 99 8E | 1 | 是 |
| ♏ | 天蝎座 | U+264F | ♏ | ♏ | E2 99 8F | 1 | 是 |
| ♐ | 射手座 | U+2650 | ♐ | ♐ | E2 99 90 | 1 | 是 |
| ♑ | 摩羯座 | U+2651 | ♑ | ♑ | E2 99 91 | 1 | 是 |
| ♒ | 水瓶座 | U+2652 | ♒ | ♒ | E2 99 92 | 1 | 是 |
| ♓ | 双鱼座 | U+2653 | ♓ | ♓ | E2 99 93 | 1 | 是 |
| ⛎ | 蛇夫座 | U+26CE | ⛎ | ⛎ | E2 9B 8E | 1 | 是 |
| ☉ | 太阳 | U+2609 | ☉ | ☉ | E2 98 89 | 1 | 否 |
| ☽ | 月亮 | U+263D | ☽ | ☽ | E2 98 BD | 1 | 否 |
| ☿ | 水星 | U+263F | ☿ | ☿ | E2 98 BF | 1 | 否 |
| ♀ | 金星 | U+2640 | ♀ | ♀ | E2 99 80 | 1 | 是 |
| ♁ | 地球 | U+2641 | ♁ | ♁ | E2 99 81 | 1 | 否 |
| ♂ | 火星 | U+2642 | ♂ | ♂ | E2 99 82 | 1 | 是 |
| ♃ | 木星 | U+2643 | ♃ | ♃ | E2 99 83 | 1 | 否 |
| ♄ | 土星 | U+2644 | ♄ | ♄ | E2 99 84 | 1 | 否 |
| ♅ | 天王星 | U+2645 | ♅ | ♅ | E2 99 85 | 1 | 否 |
| ♆ | 海王星 | U+2646 | ♆ | ♆ | E2 99 86 | 1 | 否 |
| ♇ | 冥王星 | U+2647 | ♇ | ♇ | E2 99 87 | 1 | 否 |
下面这张表按日历顺序排列,把两套口径并排放。左半边是西方占星的十二宫固定边界,右半边是 IAU 1930 边界对应的 13 星座近似区间。注意蛇夫座只出现在右边:它在 12 宫体系里根本不存在。
| 星座 | 符号 | 12 宫区间 | 平年天数 | 闰年天数 | IAU 13 星座近似区间 |
|---|---|---|---|---|---|
| 摩羯座 | ♑ | 12/22–1/19 | 29 | 29 | 1/20–2/15 |
| 水瓶座 | ♒ | 1/20–2/18 | 30 | 30 | 2/16–3/11 |
| 双鱼座 | ♓ | 2/19–3/20 | 30 | 31 | 3/12–4/18 |
| 白羊座 | ♈ | 3/21–4/19 | 30 | 30 | 4/19–5/13 |
| 金牛座 | ♉ | 4/20–5/20 | 31 | 31 | 5/14–6/20 |
| 双子座 | ♊ | 5/21–6/21 | 32 | 32 | 6/21–7/20 |
| 巨蟹座 | ♋ | 6/22–7/22 | 31 | 31 | 7/21–8/9 |
| 狮子座 | ♌ | 7/23–8/22 | 31 | 31 | 8/10–9/15 |
| 处女座 | ♍ | 8/23–9/22 | 31 | 31 | 9/16–10/30 |
| 天秤座 | ♎ | 9/23–10/23 | 31 | 31 | 10/31–11/22 |
| 天蝎座 | ♏ | 10/24–11/22 | 30 | 30 | 11/23–11/29 |
| 蛇夫座 | ⛎ | — | — | — | 11/30–12/17 |
| 射手座 | ♐ | 11/23–12/21 | 29 | 29 | 12/18–1/19 |
两张表连起来看能看出三点:一是十二星座符号的码位完全连续,从 9800 到 9811 一个不差;二是天数合计恰好是 365 天(闰年 366 天),说明这套边界既没有留空也没有互相盖住;三是 IAU 那套的段长非常不均匀,最短的天蝎座只有 7 天,最长的处女座有 45 天,差了六倍多——因为它按的是天区实际大小,不是按月相平分的。蛇夫座在这套里横跨 18 天。
输入范围、边界与精度说明
- 月份限 1~12,日期限 1~31,都必须是整数。填小数、负数、字母或留空都会被拦下,并逐条说明是哪一个字段出的问题。
- 日期要落在月份的真实天数内。各月上限依次是 31、29、31、30、31、30、31、31、30、31、30、31 天。2 月留到 29 日是为了容纳闰年生日,如果输入 2 月 30 日或 4 月 31 日,工具会直接告诉你这个日期不存在,而不是悄悄往后挪一天。
- 12 宫边界是固定值,不随年份变化。真实的天文分点每年会漂移约一天,所以 4 月 19 日出生的用户在不同网站看到白羊或金牛都算正常;本页 12 宫模式永远按
3/21–4/19这套固定表算,保证同一输入永远得到同一结果。 - IAU 13 星座的区间是近似值。国际天文学联合会 1930 年划定的天区边界是按赤经赤纬的折线定的,太阳穿过每条边界的公历日期会随岁差缓慢推移,公开资料里的表格彼此差一天很常见。本页采用坊间流传最广的一组,「蛇夫座 11/30–12/17」,逐日累加同样是 365 天无空档无重叠,可以放心当口径对照用,但不要当成精确的天文数据。
- 蛇夫座没有四元素归类。四元素(火土风水)是十二宫体系的配套概念,13 星座里没有它,所以 13 星座模式下这一格显示「—」,不会硬塞一个值给你。
- 字体覆盖是实测,不是承诺。自检用 canvas 把每个符号画进 24×24 的位图,再与一个确定没有字形的码位(
U+FFFF)逐像素比对,位图相同就判为缺字。它是启发式的:浏览器临时回退到别的字体、或者把缺字画成空白而不是方框,都可能影响判断。它用来快速定位问题,不用来给字体下结论。 - Emoji 呈色会影响排版宽度。十二星座符号里除太阳、月亮、水星、地球、木星、土星、天王星、海王星、冥王星这几个行星符号外,其余都标了默认彩色呈现。同一串文字里混排彩色符号与黑白符号时,行高和基线会不一致,做表格时可考虑加变体选择符
U+FE0E强制文字呈现。 - 码位本身永远不会因为显示不出来而丢失。屏幕上画成方框,复制到别处仍然是完整的三字节
E2 99 88。缺字只影响看,不影响传;这个星座符号计算器给出的实体写法在任何编码环境里都是安全的。
常见问题
为什么十二星座符号是连续的 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))。分号绝对不能省:♈ 后面如果紧跟数字或字母,浏览器会把它当成更长的数字继续解析,结果跑到别的字符上去。
为什么有些字体里 ♈ 能显示,⛎ 却是方框?
因为两者的收录年份差了十七年。大多数中文字库和系统字体在 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 里。
相关工具
- 生日计算器:先算出确切年龄与累计天数,再回本页查星座符号,两边用的都是同一套日期口径。
- 年龄计算器:按周岁精确到年月日,适合填表时需要「几岁几个月」的场景。
- 二十四节气查询:想知道生日当天属于哪个节气,用这一页按年份查具体日期。
- 农历公历转换:公历与农历互转,含干支与闰月,与本页的西方星座符号是两套完全不同的历法体系。
- Unicode转义反转义工具:把包含星座符号的整段文本转成
\u2648形式的转义序列,本页给的是单个符号的实体写法,两者互补。 - 文本转Unicode转义:批量文本转义,适合处理一整份含符号的词库文件。
- 字符串长度统计:核对一段文字的码元数与码点数差多少,本页讲的三字节与一码元的差异可以在那里实测。
- 日期时间:查看全部日期时间工具。