node.js修改音乐文件的信息-1中文转拼音
出现问题
人在美国,开的车没有中文显示,导致听歌时候不知道那个是什么名字,于是我想写一个electron+vue
的一个程序,转化我的音乐文件为拼音.
中文转拼音字典
let dict={
"a": "\u554a\u963f\u9515",
"ai": "\u57c3\u6328\u54ce\u5509\u54c0...",
"an": "\u978d\u6c28\u5b89\u4ffa\u6309\u6697...",
...
...
}
以这种形式把拼音对应的中文放在一起.然后得到这样的一个数据字典.
进行翻译
因为字典采用的是unicode编码,所以console.log("\u554a"),后台直接输入"啊"
换句话说就是"\u554a"=="啊" 是true.
根据这个,我们只需要遍历这个字典就可以了.
假如陈奕迅的《孤勇者》那么我们编译出来就是guyongzhe,可是这样的话就不太直观,所以要不驼峰命名法,要不空格隔开每个字.由于我不知道我车的中控能显示的效果,于是我2种方式我都写了.
//首先先为每一个字开头大写,把String的原型扩展一下,添加一个方法方便使用
String.prototype.firstUpperCase = function(){
return this.replace(/\b(\w)(\w*)/g, function($0, $1, $2) {
return $1.toUpperCase() + $2.toLowerCase();
});
}
/**
* @param {string} zh : 输入的文字,
* @param {boolean} isCapitalFirstLetter : 是否首字母大写,默认全部小写
* @return {string} 返回转义后的拼音
*/
export function zh2pinyin(zh,isCapitalFirstLetter){
let py="";
for(let val in dict){
if(dict[val].indexOf(zh)!=-1){
py=isCapitalFirstLetter?val.firstUpperCase():val;
break;
}
}
return py==""?zh:py;
};
zh2pinyin(zh,isCapitalFirstLetter)
只是单个文字转换,我们还需要将整个歌名转换.
/**
* @param {string} words 一串需要转换的文字
* @param {boolean} isNoSpace 是否有空格, 默认每个拼音之间都有空格,如果没有空格则会用驼峰命名法
* @returns {string} 返回转移后的拼音
*/
export function words2Pinyins(words,isNoSpace){
let space=isNoSpace?"":" ";
let pinyins="";
let wordsArr=words.split("")
wordsArr.forEach(word=>{//遍历每个字,进行转义拼凑.
let sp=space //每个字后面空格
if(/^[0-9a-zA-Z\s+\.\`\']/.test(word)) sp="" //是否是英文数字,或者" . " ,是的话不需要空格.
pinyins+=zh2pinyin(word,isNoSpace)+sp
})
return pinyins
}
万事俱备,可以用了.
繁体字转换简体字
等等 ~ ~ ~啥??还有问题?
是的,因为中文有简体繁体字,某些特殊渠道拿到的歌也许是繁体的.于是我还需要写一写方法转换
因为繁体字,简体字,基本是一一对应的,所以我们不需要用对象方式的字典,我们只需要一个个将有繁体字的排成一个字符串,分别写成简体繁体2个字符串.我这里就把这两个字符串再打包再一个数组里面.
let dictionarys = [
'锕皑蔼碍爱嗳....',
'錒皚藹礙愛噯....'
]
为了以后可以复用这个方法,我把繁简呼唤的方法写出来
/**
* @param {string} word 输入文字
* @param {boolean} isS2T 是否简体转换繁体
* @return {string} 返回翻译后的文字
*/
function zhConvert(word,isS2T){
let wordsPool=isS2T?dictionarys[0]:dictionarys[1] // 原始字库
let convertPool=isS2T?dictionarys[1]:dictionarys[0] // 转义字库
let converted=word
if(wordsPool.indexOf(word)!=-1){//判断word 是不是在原始字库里面,是的话进行转义
converted=convertPool.charAt(wordsPool.indexOf(word))
}
return converted
}
为了方便使用我单独暴露2个函数,分别繁体转简体,和简体转繁体
/**
* @param {string} word 输入文字
* @return {string} 返回翻译后的文字
*/
function simplified2Traditional(word){
return zhConvert(word,true)
}
/**
* @param {string} word 输入文字
* @return {string} 返回翻译后的文字
*/
function traditional2Simplified(word){
return zhConvert(word)
}
export {simplified2Traditional,traditional2Simplified}
最后别忘记把zh2pinyin函数修改,因为拼音字典都是简体,所以直接将繁体转简体
/**
* @param {string} zh : 输入的文字,
* @param {boolean} isCapitalFirstLetter : 是否首字母大写,默认全部小写
* @return {string} 返回转义后的拼音
*/
export function zh2pinyin(zh,isCapitalFirstLetter){
let py=zh;
let zh2=traditional2Simplified(zh, true)//将繁体字转换简体字
for(let val in dict){ //查找文字进行遍历,查找对应的拼音
if(dict[val].indexOf(zh2)!=-1){
py=isCapitalFirstLetter? val.firstUpperCase(): val;
break
}
}
return py;
};
自此完成汉字转拼音的函数