接上文,之前发过一篇「汉语拼音的写法 - 从精通到打不出来」
汉语拼音转换器算是比较成熟了,但是一些冷门的规则依然支持较差 (那就自己手搓一个吧
目前用下来使用体验最好的是谷歌翻译,少数能实现句首大写,按词分割还免费无广的,
本文就当作对接其的二次转换吧 (
以下写法均遵循写法现行《汉语拼音方案》(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」一般作为韵尾,因此这条规则不作使用 ↩