韵目代日表示法-- 一种编码方法,以前用于电报中表示日期

以前电报惜字如金,为了减少日期表示占用的字数,清末洪均发明了一种称为“韵目代日”的表示法,月(1-12)用12地支来表示。日则用《平水韵》中的韵目字来代替。这样一个某月某日的日期,用两个汉字就可以代替(节省了2~4个汉字)。

其中稍微复杂一点的就是韵目代日,该方法为同一天指定了2~5个韵字,但优先使用某一个即可。简化版本就是每一天用一个汉字,口诀如下

一东,二冬,三江,四支,五微,六鱼,七虞,八齐,九佳,十灰,十一真,十二文,十三元,十四寒,十五删,十六铣,十七筱,十八巧,十九巧,20哿(ge第3声),21马,22养,23梗,24敬,25有,26宥,27感,28勘,29艳,30卅,31世(或引)

(洪均原来设计时30为陷,但军队收发电报讨厌陷字,故后来改为卅)

这个方法从清末用到了解放后,因此近代史上有不少有名的电报就出现了这些韵目在名称中,如马日事变的马日即是21号,汪精卫叛变的著名艳电即为29号发出的电报。丑巧电则是表示2月18号发出的电报。

是记为备忘。

点击查看代码
#include <iostream>
#include <string>
using namespace std;
//
 int PreferedIndex(int day)
{//返回以0为基数的索引号
if (day<=15) return 0;
if (day==24 || day==26 || day==28 || day==29 || day==30) return 3;
return 2;
}

string MonthToStr(int Month){
string MonthStr[12]={"子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"};
if ((Month>12) or (Month<1))
 {return "";}
return MonthStr[Month-1];
}

string DayToYun(int day, string AvoidStr=""){
//依次为第1声,2声,3声,4声,入声排列韵目汉字。AvoidStr告诉函数哪些字已经用过,默认为空。
//用多个韵目来代替某一个日期,可以区分同一天发送的多份电报,避免重复使用同一字来代表日期。
//由清代洪均根据《平水韵》中的韵目字,来代替特定的日期,从而节省电报中日期的用字 。
string YunArr[31][5]={
{"东","先","董","送","屋"}, // day 1
{"冬","萧","肿","宋","沃"}, // day 2
{"江","肴","讲","绛","觉"}, // day 3
{"支","豪","纸","寘","质"}, // day 4 
{"微","歌","尾","未","物"}, // day 4
{"鱼","麻","语","御","月"}, // day 6
{"虞","阳","麌","遇","曷"}, // day 7
{"齐","庚","荠","霁","黠"}, // day 8
{"佳","青","蟹","泰","屑"}, // day 9
{"灰","蒸","贿","卦","药"}, // day 10
{"真","尤","轸","队","陌"}, // day 11
{"文","侵","吻","震","锡"}, // day 12
{"元","覃","阮","问","职"}, // day 13
{"寒","盐","旱","愿","缉"}, // day 14
{"删","咸","潸","翰","合"}, // day 15
{"","","铣","谏","叶"}, // day 16
{"","","蓧","霰","洽"}, // day 17
{"","","巧","啸",""}, // day 18
{"","","皓","效",""}, // day 19
{"","","哿","号",""}, // day 20  ge第3声
{"","","马","箇",""}, // day 21
{"","","养","祃",""}, // day 22
{"","","梗","漾",""}, // day 23
{"","","迥","敬",""}, // day 24,多用敬字
{"","","有","径",""}, // day 25
{"","","寝","宥",""}, // day 26,多用宥字
{"","","感","沁",""}, // day 27
{"","","俭","勘",""}, // day 28,多用勘字
{"","","豏","艳",""}, // day 29 多用艳字
{"","","","卅",""}, // day 30,原为陷,军队不愿用,改为卅
{"","","世","引",""}, // day 31 世类卅一,引形31.
};
if ((day>31) || (day<1)) {
cout<<"wrong day"<<day<<endl;
return "";}

int pindex=PreferedIndex(day); //此处理保证有结果

if (AvoidStr.empty()) //如果没有设置需要避开的字,则直接返回优先韵目并退出
{return YunArr[day-1][pindex];}
//如果设置了需要避开的字,寻找一下
int i=0;
while (i<=4)
{
if (AvoidStr.find(YunArr[day-1][i])!=string::npos) //出现在AvoidStr中则找下一个,否则作为结果返回即可。
{i++;}
else
{
return YunArr[day-1][i];
}
}

//如果上面还不能找到,则返回空字符串。
return "";
}


int main() {
/* for(int i=1;i<32;i++)
{
    std::cout << i<< "--->" <<DayToYun(i) << std::endl;
} */
int month,day;
cout<<"pls input month (1..12):"<<endl;
cin>>month;
cout<<"pls input day(1..31):"<<endl;
cin>>day;

cout<<month<<"-"<<day<<"韵目代日法表示为:" <<MonthToStr(month)<<DayToYun(day)<<endl<<endl;
system("pause");
return 0;
}
posted @ 2025-05-19 11:40  dingxianghuan  阅读(205)  评论(0)    收藏  举报