Skip to content

Commit fc24966

Browse files
committed
Add Karlgren
1 parent dd87ce9 commit fc24966

File tree

3 files changed

+147
-0
lines changed

3 files changed

+147
-0
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ https://nk2028-1305783649.file.myqcloud.com/qieyun-examples/<filename>
2121

2222
**切韻音系擬音 reconstruction of the Qieyun phonological system**
2323

24+
- 高本漢擬音 (Bernhard Karlgren’s Reconstruction): `karlgren.js`
2425
- 潘悟雲擬音 (Pan Wuyun’s Reconstruction): `panwuyun.js`
2526
- unt 切韻擬音 (unt’s Qieyun Reconstruction): `unt.js`
2627
- msoeg 中古擬音 V8 (msoeg’s Middle Chinese Reconstruction V8): `msoeg_v8.js`

karlgren.js

Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
/* 高本漢擬音
2+
*
3+
* 擬音來自高本漢後期著作:
4+
*
5+
* - Grammata Serica. BMFEA, 1940, 12: 1–471.
6+
* - Compendium of Phonetics in Ancient and Archaic Chinese. BMFEA, 1954, 26: 211–367.
7+
* - Grammata Serica Recensa. BMFEA, 1957, 29: 1–332.
8+
* - 中國聲韻學大綱. 張洪年, 譯. 香港: 香港中文大學研究院中國語言文學會, 1968. (臺北: 中華叢書編審委員會, 1972)
9+
* - 中上古漢語音韻綱要. 聶鴻音, 譯. 濟南: 齊魯書社, 1987.
10+
* - 漢文典(修訂本). 潘悟雲, 楊劍橋, 陳重業, 張洪明, 編譯. 上海: 上海辭書出版社, 1997.
11+
*
12+
* 以及後來學者的整理:
13+
*
14+
* - Samuel E. Martin. The Phonemes of Ancient Chinese. JAOS, 1953, 73 (2): Supplement.
15+
* - 李榮. 高本漢構擬的切韵音. 切韵音系. 北京: 科學出版社, 1956: 104–106. (黃笑山, 校訂. 北京: 商務印書館, 2020)
16+
* - 李方桂. 中古音系. 上古音研究. 北京: 商務印書館, 1980: 5–9.
17+
* - 潘悟雲. 諸家《切韻》聲類擬音比較表, 諸家《切韻》韻母擬音比較表. 漢語歷史音韻學. 上海: 上海教育出版社, 2000: 59–61, 83–88.
18+
*
19+
* 這些後期著作與高本漢早期的 Études sur la phonologie chinoise(《中國音韻學研究》)相比,
20+
* 不僅個別聲韻母的擬音作了改動,所採用的音標字母、介音的拼寫風格也完全不同。
21+
* 再考慮到今天引用高本漢擬音一般是引用其後期擬音,因此本方案暫不收錄其早期擬音。
22+
*
23+
* 音標提供 3 種風格:
24+
*
25+
* - 原書音標:高本漢後期著作採用的拉丁字母音標
26+
* - 國際音標(原貌):《中國音韻學研究》中譯本風格(但原書 ɡ 作 g,不採用)
27+
* - 國際音標(通用):現在的中國通用音標符號(即比標準國際音標多 ȶ、ȡ、ȵ)
28+
*
29+
* 聲調提供 3 種風格:
30+
*
31+
* - 不標
32+
* - 平ˉ 上ˊ 去ˋ:Grammata Serica 和 Compendium 的標法
33+
* - 上꞉ 去˗:Grammata Serica Recensa 的標法
34+
*
35+
* @author unt
36+
*/
37+
38+
const is = (...x) => 音韻地位.屬於(...x);
39+
const when = (...x) => 音韻地位.判斷(...x);
40+
41+
const 音標字典 = {
42+
'原書音標': {
43+
ʰ: 'ʼ', ʱ: 'ʼ',
44+
ʔ: 'ꞏ', ɡ: 'g', ŋ: 'ng',
45+
ȶ: 't̑', ȡ: 'd̑', ȵ: 'ń', // 上加弧線是瑞典方言字母表腭化的一種方式,不是揚抑符
46+
ɕ: 'ṣ', ʑ: 'ẓ',
47+
ʂ: 'ś', ʐ: 'ź',
48+
x: 'χ', ɣ: 'γ',
49+
50+
: 'ă', ɑ̆: 'ậ', : 'ĕ',
51+
ɛ: 'ä', ɔ: 'å',
52+
// 央次低元音原書作“ɒ”形,實際上是 ɐ 的斜體,不是很多人引用成的 ɒ。這個符號來自瑞典方言字母
53+
æ: 'ɛ', ɐ: 選項.央次低元音?.slice(0, 1) || 'ɐ',
54+
ɑ: 'â',
55+
},
56+
'國際音標(原貌)': {
57+
ʰ: 'ʻ', ʱ: 'ʻ', ʔ: 'ˀ', // ɡ: 'g',
58+
: 'ʈʂ', : 'ɖʐ',
59+
: 'ȶɕ', : 'ȡʑ',
60+
},
61+
'國際音標(通用)': {
62+
ʱ: 選項.濁送氣 || 'ʰ',
63+
},
64+
};
65+
66+
if (!音韻地位) return [
67+
['音標體系', [3].concat(Object.keys(音標字典))],
68+
['聲調記號', [3, '不標', '平ˉ 上ˊ 去ˋ', '上꞉ 去˗']],
69+
['央次低元音', 選項.音標體系?.includes('原書') ? [1, 'ɐ(準確)', 'ɒ(流行但不準確)'] : null],
70+
['濁送氣', 選項.音標體系?.includes('通用') ? [1, 'ʰ', 'ʱ'] : null],
71+
];
72+
73+
function get聲母() {
74+
let 聲母 = {
75+
: 'p', : 'pʰ', : 'bʱ', : 'm',
76+
: 't', : 'tʰ', : 'dʱ', : 'n', : 'l',
77+
: 'ȶ', : 'ȶʰ', : 'ȡʱ', : 'ȵ',
78+
: 'k', : 'kʰ', : 'ɡʱ', : 'ŋ',
79+
: 'ʔ', : 'x', : 'ɣ', : '',
80+
: 'ts', : 'tsʰ', : 'dzʱ', : 's', : 'z',
81+
: 'tʂ', : 'tʂʰ', : 'dʐʱ', : 'ʂ', : 'dʐʱ',
82+
: 'tɕ', : 'tɕʰ', : 'dʑʱ', : 'ɕ', : 'ʑ', : 'ȵʑ', : 'j',
83+
// 注意云以、常船是顛倒的,俟同崇
84+
}[音韻地位.];
85+
return 聲母;
86+
}
87+
88+
function get韻母() {
89+
const = {
90+
: '欣', : '痕', : '咍', : '嚴',
91+
: '脂', : '佳', // 這兩對高本漢無法找到區分方法
92+
}[音韻地位.] ?? 音韻地位.;
93+
const 元音表 = {
94+
// 三等的 ə、o 暫加短音符以便與一等區分,之後移除
95+
i: '脂     ', ï: '      ', u: '虞東',
96+
: '   眞幽 ', ə̆: ' 蒸 欣 侵', : '魚鍾', e̯i: '微', ə̯̆u: '尤',
97+
e: ' 青齊先蕭添', ə: ' 登 痕  ', o: '模冬', ie̯: '支', ə̯u: '侯',
98+
ɛ: ' 清祭仙宵鹽', ɐ: ' 庚廢元 嚴', ɔ: ' 江',
99+
æ: ' 耕 臻  ',
100+
: '  皆山 咸', ɑ̆: '  咍  覃',
101+
a: '麻陽佳刪肴銜', ɑ: '歌唐泰寒豪談',
102+
};
103+
const 韻尾列表 = is`舒聲` ? ['', ...'ŋinum'] : [...' k t p'];
104+
105+
let 韻核 = Object.keys(元音表).find(e => 元音表[e].includes());
106+
let 韻尾 = 韻尾列表[元音表[韻核].indexOf()];
107+
韻核 = 韻核.replace('ə̆', 'ə').replace('ŏ', 'o');
108+
let 介音 = '';
109+
if (is`止攝 (鈍音 非 云母 或 來母)`) 介音 += 'j'; // 云母已經是 j,無需加
110+
if (is`三等 非 止攝`) 介音 += 'i̯';
111+
if (is`四等`) 介音 += 'i';
112+
介音 += when([
113+
['模冬灰文魂韻', 'u'],
114+
['歌寒韻 非 開口', 'u'], // 戈桓
115+
['眞韻 合口 (重紐A類 或 銳音 非 莊組)', 'u'], // 諄
116+
['合口 或 魚鍾凡韻', 'w'],
117+
['幫組', [
118+
['微韻', 'w'],
119+
['廢元韻 或 庚韻 三等', 'w'], // ɐ
120+
['耕韻 明母', 'w'], // æ
121+
['陽夬刪韻', 'w'], // a, 但麻佳韻原書無 w(儘管擬音不分佳夬)
122+
['皆韻 或 山韻 入聲', 'w'], // ă,但山韻舒聲原書無 w
123+
['泰韻 或 唐韻 舒聲', 'w'], // ɑ,同歌寒,但唐韻入聲原書無 w
124+
// 個別字合口的情況不計入,如《漢文典》中:
125+
// “邊”歸合口,但同小韻的“編”歸開口
126+
// “憫”歸合口,但同小韻的“緡”歸開口
127+
]],
128+
['', ''],
129+
], '', true);
130+
131+
return 介音 + 韻核 + 韻尾;
132+
}
133+
134+
function get聲調() {
135+
if (選項.聲調記號 === '四角標圈') return {
136+
137+
};
138+
const 聲調記號字典 = Object.fromEntries(選項.聲調記號.split(' ').map(e => [...e]));
139+
return 聲調記號字典[音韻地位.] ?? '';
140+
}
141+
142+
let 音節 = get聲母() + get韻母() + get聲調();
143+
Object.entries(音標字典[選項.音標體系]).forEach(([k, v]) => { 音節 = 音節.replace(k, v); });
144+
return 音節;

test/main.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import {
77
kyonh,
88
zyepheng,
99
sliark_peengqvim,
10+
karlgren,
1011
panwuyun,
1112
unt,
1213
msoeg_v8,
@@ -36,6 +37,7 @@ assert_equal(blankego(音韻地位), "sjev");
3637
assert_equal(kyonh(音韻地位), "sjeux");
3738
assert_equal(zyepheng(音韻地位), "shiéu");
3839
assert_equal(sliark_peengqvim(音韻地位), "sjewx");
40+
assert_equal(karlgren(音韻地位), "ɕi̯ɛu꞉");
3941
assert_equal(panwuyun(音韻地位), "ɕiᴇu˧˥");
4042
assert_equal(unt(音韻地位), "ɕéw");
4143
assert_equal(msoeg_v8(音韻地位), "çiɛuˀ");

0 commit comments

Comments
 (0)