接上文,之前發過一篇「漢語拼音的寫法 - 從精通到打不出來」
漢語拼音轉換器算是比較成熟了,但是一些冷門的規則依然支持較差 (那就自己手搓一個吧
目前用下來使用體驗最好的是谷歌翻譯,少數能實現句首大寫,按詞分割還免費無廣的,
本文就當作對接其的二次轉換吧 (
以下寫法均遵循寫法現行《漢語拼音方案》(PDF).
簡短拼式所使用的特殊字符:
-
zh → ẑ / Zh → Ẑ
-
ch → ĉ / Ch → Ĉ
-
sh → ŝ / Sh → Ŝ
-
ng → ŋ / ( NG → Ŋ ) 1
這幾個雙字母組合「 ẑ、ŝ、ĉ」好搞,但後面的「ŋ」就有點麻煩了,如:
- 相安「xiang'an」
- 線杆「xiangan」
這是因為只有在如「a/o/e」韻母開頭的音節前,自動 添加隔音符號以防造成混淆,而不在聲母前添加
在「i/u/ü」前沒有聲母的時候,添加「y/w」寫作韻頭字母
所以,為了分別這是『以「ng」結尾的音節』還是『以「n」結尾和以「g」開頭的音節』
當且僅當,「ng」後 不接 韻母 [āáǎàaēéěèeōóǒòoīíǐìiūúǔùuüǖǘǚǜ] 時,轉換為「ŋ」
或者僅在後接聲母 [bpmfdtnlgkhjqxzcsr] 時轉換應該也可以 (
兒化音
兒化音的「er」一般顯示為輕聲,即不標聲調
私查詢了漢典, 在這裡沒有找到輕聲的單獨成字的「er」
姑且就全部替換吧:
- 「(此處有一空格) er」→「r」
代碼部分:
可以看出來不難實現,寫個正則表達式然後全部替換就 OK 了
HTML
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>實時預覽</title>
<style>
body {
margin: 0;
padding: 0;
font-family: 'SimHei', sans-serif;
display: flex;
height: 100vh;
background-color: #f5f5f5;
}
.container {
display: flex;
width: 100%;
}
.textarea-container {
width: 50%;
height: 100%;
}
textarea {
width: 100%;
height: 100%;
border: none;
padding: 10px;
font-size: 16px;
resize: none;
box-sizing: border-box;
outline: none;
font-family: inherit; / }
</style>
</head>
<body>
<div class="container">
<div class="textarea-container">
<textarea id="input" placeholder="請於此輸入拼音..."></textarea>
</div>
<div class="textarea-container">
<textarea id="output" placeholder="顯示轉換後內容..." readonly></textarea>
</div>
</div>
<script>
const input = document.getElementById('input');
const output = document.getElementById('output');
function transformText(text) {
text = text.replace(/Zh/g, 'Ẑ')
.replace(/zh/g, 'ẑ')
.replace(/Ch/g, 'Ĉ')
.replace(/ch/g, 'ĉ')
.replace(/Sh/g, 'Ŝ')
.replace(/sh/g, 'ŝ')
.replace(/ er/g, 'r');
text = text.replace(/ng(?![āáǎàaēéěèeōóǒòoīíǐìiūúǔùuüǖǘǚǜ])/g, 'ŋ');
return text;
}
input.addEventListener('input', () => {
const transformed = transformText(input.value);
output.value = transformed;
});
</script>
</body>
</html>
https://wikidot.eu.org/tool.html
單頁工具掛這裡了
沒用上的:
「ê」以及那幾個鼻音字母發音多為口語使用,書面語使用極少,這裡請允許筆者忽略帶過.
Footnotes#
-
谷歌翻譯自動執行句首大寫,「ng」一般作為韻尾,因此這條規則不作使用 ↩