微信音乐小程序开发实践
<p style="text-align: left"><span style="font-size: 18pt"><strong>使用微信小程序实现个人音乐播放平台</strong></span></p><p style="text-align: left"><span style="font-size: 18pt"><strong> </strong></span></p>
<p>一,效果展示</p>
<p><img src="https://img2020.cnblogs.com/blog/689797/202102/689797-20210223134229280-1145275743.jpg"> <img src="https://img2020.cnblogs.com/blog/689797/202102/689797-20210223134317553-771615125.jpg"> <img src="https://img2020.cnblogs.com/blog/689797/202102/689797-20210223134410041-21829464.jpg"> <img src="https://img2020.cnblogs.com/blog/689797/202102/689797-20210223134450146-980623794.jpg"></p>
<p>二,实现的功能</p>
<p>1,音乐播放,暂停,切换,歌词同步展示。</p>
<p>2,音乐收藏,根据搜索和播放历史推荐,播放排行榜展示。</p>
<p> </p>
<p>三,数据库设计</p>
<p>1,基于功能需求,设计概念模型</p>
<p><img src="https://img2020.cnblogs.com/blog/689797/202102/689797-20210219145043809-1415752882.png"></p>
<p>2,概念模型向逻辑关系模型转化</p>
<p>转化的一般原则:</p>
<p>1) 一个1:1联系可以转换为一个独立的关系模式,也可以与任意的一端对应的关系模式合并。</p>
<p>2)一个1:n的联系可以转换为一个独立的关系模式,也可以与n端对应的关系模式合并。</p>
<p>3) 一个n:m联系转化为一个关系模式,与该联系相连的各实体的码以及联系本身的属性均转换为关系的属性。</p>
<p>4)具有相同码的关系模式合并。</p>
<p>为避免关系模式出现以下问题:数据冗余,更新异常,插入异常,删除异常等。关系模式需要符合一些基本的条件。</p>
<p>1) 每一个分量必须是不可分割的数据项(1NF)</p>
<p>2) 且,每一个非主属性完全依赖于任何一个候选码(2NF)</p>
<p>3) 且每一个决定因素都包含码(BCNF)</p>
<p>转换结果如下:</p>
<p><img src="https://img2020.cnblogs.com/blog/689797/202102/689797-20210219145900524-1435121492.png"></p>
<p> </p>
<p>四,实际开发总结</p>
<p>一)提取音乐信息</p>
<p>后台语言使用nodejs,使用jsmediatags模块提取音乐封面,歌手,专辑等信息。</p>
<p>二)歌词编码类型转换</p>
<p>nodejs读取非utf8编码类型的歌词出现乱码,需要把gb2312的歌词转换成utf8格式。</p>
<p>使用.net core读取音乐文件夹,生成音乐资源脚本文件(sql),并把编码格式gb2312歌词文件转换成utf8格式。</p>
<div class="cnblogs_code"><img src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif"><img id="code_img_opened_3b351ed7-ddc7-4979-9110-9f3ff1c9dfcf" class="code_img_opened lazyload" style="display: none" data-src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif">
<div id="cnblogs_code_open_3b351ed7-ddc7-4979-9110-9f3ff1c9dfcf" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.IO;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Text;
</span><span style="color: rgba(0, 0, 255, 1)">namespace</span><span style="color: rgba(0, 0, 0, 1)"> readmysic
{
</span><span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Program
{
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">生成音乐sql脚本</span>
<span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span> Main(<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">[] args)
{
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">string path = "G:\\ftpmusic";
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">string path2 = "G:\\已上传\\";</span>
<span style="color: rgba(0, 0, 255, 1)">string</span> path = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">G:\\ftpmusic</span><span style="color: rgba(128, 0, 0, 1)">"</span>; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">本地音乐文件路径</span>
<span style="color: rgba(0, 0, 255, 1)">int</span> musicid = <span style="color: rgba(128, 0, 128, 1)">1</span>;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">插入数据库表(music)主键开始id</span>
<span style="color: rgba(0, 0, 255, 1)">string</span> sql = <span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">;
DirectoryInfo filepath </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> DirectoryInfo(path);
FileInfo[] files </span>=<span style="color: rgba(0, 0, 0, 1)"> filepath.GetFiles();
</span><span style="color: rgba(0, 0, 255, 1)">foreach</span>(FileInfo f <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> files){
</span><span style="color: rgba(0, 0, 255, 1)">string</span> tex =<span style="color: rgba(0, 0, 0, 1)"> f.Extension;
</span><span style="color: rgba(0, 0, 255, 1)">string</span> name =<span style="color: rgba(0, 0, 0, 1)"> f.Name;
</span><span style="color: rgba(0, 0, 255, 1)">if</span>(tex == <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">.mp3</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">){
</span><span style="color: rgba(0, 0, 255, 1)">string</span> temp = name.Split(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">.</span><span style="color: rgba(128, 0, 0, 1)">'</span>)[<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">];
</span><span style="color: rgba(0, 0, 255, 1)">string</span> title = <span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">string</span> songer = <span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">if</span>(temp.IndexOf(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">-</span><span style="color: rgba(128, 0, 0, 1)">'</span>) > <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">){
songer </span>= temp.Split(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">-</span><span style="color: rgba(128, 0, 0, 1)">'</span>)[<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">];
title </span>=temp.Split(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">-</span><span style="color: rgba(128, 0, 0, 1)">'</span>)[<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">];
}</span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">{
title </span>=<span style="color: rgba(0, 0, 0, 1)">temp;
}
</span><span style="color: rgba(0, 0, 255, 1)">string</span> temsql= <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">insert into music(id,name,title,songer,totalPlay) VALUES ({0},'{1}','{2}','{3}',0);\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
temsql </span>= <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">.Format(temsql,musicid,name,title,songer);
sql</span>+=<span style="color: rgba(0, 0, 0, 1)">temsql;
musicid</span>++<span style="color: rgba(0, 0, 0, 1)">;
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">删除重复文件</span>
<span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">stringfiletem = path2 + name;
if(File.Exists(filetem)){
Console.WriteLine(name);
File.Delete(filetem);
} </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">编码格式转换</span>
<span style="color: rgba(0, 0, 255, 1)">if</span>(f.Extension == <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">.lrc</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">){
FileStream fs </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> FileStream(f.FullName,FileMode.Open);
Encoding tr </span>=<span style="color: rgba(0, 0, 0, 1)">GetType(fs);
Console.WriteLine(name</span>+<span style="color: rgba(0, 0, 0, 1)">tr.BodyName);
</span><span style="color: rgba(0, 0, 255, 1)">if</span>(tr.BodyName == <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">gb2312</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">){
gb2312toutf8(f.FullName);
}
}
}
Console.Write(sql);
</span><span style="color: rgba(0, 0, 255, 1)">string</span> sqlname = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">G:\\ftpmusic\\temsql.txt</span><span style="color: rgba(128, 0, 0, 1)">"</span>;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">生成的脚本文件地址</span>
<span style="color: rgba(0, 0, 0, 1)"> Writesql(sqlname,sql);
}
</span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><summary></span>
<span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 给定文件的路径,读取文件的二进制数据,判断文件的编码类型
</span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"></summary></span>
<span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><param name="FILE_NAME"></span><span style="color: rgba(0, 128, 0, 1)">文件路径</span><span style="color: rgba(128, 128, 128, 1)"></param></span>
<span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><returns></span><span style="color: rgba(0, 128, 0, 1)">文件的编码类型</span><span style="color: rgba(128, 128, 128, 1)"></returns></span>
<span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> System.Text.Encoding GetType(<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)"> FILE_NAME)
{
FileStream fs </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> FileStream(FILE_NAME, FileMode.Open, FileAccess.Read);
Encoding r </span>=<span style="color: rgba(0, 0, 0, 1)"> GetType(fs);
fs.Close();
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> r;
}
</span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><summary></span>
<span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 通过给定的文件流,判断文件的编码类型
</span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"></summary></span>
<span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><param name="fs"></span><span style="color: rgba(0, 128, 0, 1)">文件流</span><span style="color: rgba(128, 128, 128, 1)"></param></span>
<span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><returns></span><span style="color: rgba(0, 128, 0, 1)">文件的编码类型</span><span style="color: rgba(128, 128, 128, 1)"></returns></span>
<span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span><span style="color: rgba(0, 0, 0, 1)"> System.Text.Encoding GetType(FileStream fs)
{
</span><span style="color: rgba(0, 0, 255, 1)">byte</span>[] Unicode = <span style="color: rgba(0, 0, 255, 1)">new</span> <span style="color: rgba(0, 0, 255, 1)">byte</span>[] { <span style="color: rgba(128, 0, 128, 1)">0xFF</span>, <span style="color: rgba(128, 0, 128, 1)">0xFE</span>, <span style="color: rgba(128, 0, 128, 1)">0x41</span><span style="color: rgba(0, 0, 0, 1)"> };
</span><span style="color: rgba(0, 0, 255, 1)">byte</span>[] UnicodeBIG = <span style="color: rgba(0, 0, 255, 1)">new</span> <span style="color: rgba(0, 0, 255, 1)">byte</span>[] { <span style="color: rgba(128, 0, 128, 1)">0xFE</span>, <span style="color: rgba(128, 0, 128, 1)">0xFF</span>, <span style="color: rgba(128, 0, 128, 1)">0x00</span><span style="color: rgba(0, 0, 0, 1)"> };
</span><span style="color: rgba(0, 0, 255, 1)">byte</span>[] UTF8 = <span style="color: rgba(0, 0, 255, 1)">new</span> <span style="color: rgba(0, 0, 255, 1)">byte</span>[] { <span style="color: rgba(128, 0, 128, 1)">0xEF</span>, <span style="color: rgba(128, 0, 128, 1)">0xBB</span>, <span style="color: rgba(128, 0, 128, 1)">0xBF</span> }; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">带BOM </span>
Encoding reVal =<span style="color: rgba(0, 0, 0, 1)"> Encoding.Default;
BinaryReader r </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> BinaryReader(fs, System.Text.Encoding.Default);
</span><span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> i;
</span><span style="color: rgba(0, 0, 255, 1)">int</span>.TryParse(fs.Length.ToString(), <span style="color: rgba(0, 0, 255, 1)">out</span><span style="color: rgba(0, 0, 0, 1)"> i);
</span><span style="color: rgba(0, 0, 255, 1)">byte</span>[] ss =<span style="color: rgba(0, 0, 0, 1)"> r.ReadBytes(i);
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (IsUTF8Bytes(ss) || (ss[<span style="color: rgba(128, 0, 128, 1)">0</span>] == <span style="color: rgba(128, 0, 128, 1)">0xEF</span> && ss[<span style="color: rgba(128, 0, 128, 1)">1</span>] == <span style="color: rgba(128, 0, 128, 1)">0xBB</span> && ss[<span style="color: rgba(128, 0, 128, 1)">2</span>] == <span style="color: rgba(128, 0, 128, 1)">0xBF</span><span style="color: rgba(0, 0, 0, 1)">))
{
reVal </span>=<span style="color: rgba(0, 0, 0, 1)"> Encoding.UTF8;
}
</span><span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (ss[<span style="color: rgba(128, 0, 128, 1)">0</span>] == <span style="color: rgba(128, 0, 128, 1)">0xFE</span> && ss[<span style="color: rgba(128, 0, 128, 1)">1</span>] == <span style="color: rgba(128, 0, 128, 1)">0xFF</span> && ss[<span style="color: rgba(128, 0, 128, 1)">2</span>] == <span style="color: rgba(128, 0, 128, 1)">0x00</span><span style="color: rgba(0, 0, 0, 1)">)
{
reVal </span>=<span style="color: rgba(0, 0, 0, 1)"> Encoding.BigEndianUnicode;
}
</span><span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (ss[<span style="color: rgba(128, 0, 128, 1)">0</span>] == <span style="color: rgba(128, 0, 128, 1)">0xFF</span> && ss[<span style="color: rgba(128, 0, 128, 1)">1</span>] == <span style="color: rgba(128, 0, 128, 1)">0xFE</span> && ss[<span style="color: rgba(128, 0, 128, 1)">2</span>] == <span style="color: rgba(128, 0, 128, 1)">0x41</span><span style="color: rgba(0, 0, 0, 1)">)
{
reVal </span>=<span style="color: rgba(0, 0, 0, 1)"> Encoding.Unicode;
}
</span><span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span>(ss[<span style="color: rgba(128, 0, 128, 1)">0</span>] == <span style="color: rgba(128, 0, 128, 1)">91</span> && ss[<span style="color: rgba(128, 0, 128, 1)">1</span>] == <span style="color: rgba(128, 0, 128, 1)">116</span> && ss[<span style="color: rgba(128, 0, 128, 1)">2</span>] == <span style="color: rgba(128, 0, 128, 1)">105</span><span style="color: rgba(0, 0, 0, 1)">){
System.Text.Encoding.RegisterProvider (System.Text.CodePagesEncodingProvider.Instance);
reVal </span>= Encoding.GetEncoding(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">GB2312</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
}
r.Close();
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> reVal;
}
</span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><summary></span>
<span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 判断是否是不带 BOM 的 UTF8 格式
</span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"></summary></span>
<span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><param name="data"></param></span>
<span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><returns></returns></span>
<span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">bool</span> IsUTF8Bytes(<span style="color: rgba(0, 0, 255, 1)">byte</span><span style="color: rgba(0, 0, 0, 1)">[] data)
{
</span><span style="color: rgba(0, 0, 255, 1)">int</span> charByteCounter = <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">计算当前正分析的字符应还有的字节数 </span>
<span style="color: rgba(0, 0, 255, 1)">byte</span> curByte; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">当前分析的字节. </span>
<span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">int</span> i = <span style="color: rgba(128, 0, 128, 1)">0</span>; i < data.Length; i++<span style="color: rgba(0, 0, 0, 1)">)
{
curByte </span>=<span style="color: rgba(0, 0, 0, 1)"> data;
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (charByteCounter == <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">)
{
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (curByte >= <span style="color: rgba(128, 0, 128, 1)">0x80</span><span style="color: rgba(0, 0, 0, 1)">)
{
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">判断当前 </span>
<span style="color: rgba(0, 0, 255, 1)">while</span> (((curByte <<= <span style="color: rgba(128, 0, 128, 1)">1</span>) & <span style="color: rgba(128, 0, 128, 1)">0x80</span>) != <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
{
charByteCounter</span>++<span style="color: rgba(0, 0, 0, 1)">;
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">标记位首位若为非0 则至少以2个1开始 如:110XXXXX...........1111110X </span>
<span style="color: rgba(0, 0, 255, 1)">if</span> (charByteCounter == <span style="color: rgba(128, 0, 128, 1)">1</span> || charByteCounter > <span style="color: rgba(128, 0, 128, 1)">6</span><span style="color: rgba(0, 0, 0, 1)">)
{
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
}
}
}
</span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">
{
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">若是UTF-8 此时第一位必须为1 </span>
<span style="color: rgba(0, 0, 255, 1)">if</span> ((curByte & <span style="color: rgba(128, 0, 128, 1)">0xC0</span>) != <span style="color: rgba(128, 0, 128, 1)">0x80</span><span style="color: rgba(0, 0, 0, 1)">)
{
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
}
charByteCounter</span>--<span style="color: rgba(0, 0, 0, 1)">;
}
}
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (charByteCounter > <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">)
{
</span><span style="color: rgba(0, 0, 255, 1)">throw</span> <span style="color: rgba(0, 0, 255, 1)">new</span> Exception(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">非预期的byte格式</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
}
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
}
</span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><summary></span>
<span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 实现gb2312歌词转utf8
</span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"></summary></span>
<span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><param name="path"></span><span style="color: rgba(0, 128, 0, 1)">歌词路径</span><span style="color: rgba(128, 128, 128, 1)"></param></span>
<span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span> gb2312toutf8(<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)"> path)
{
</span><span style="color: rgba(0, 0, 255, 1)">var</span> data =<span style="color: rgba(0, 0, 0, 1)"> File.ReadAllBytes(path);
System.Text.Encoding.RegisterProvider (System.Text.CodePagesEncodingProvider.Instance);
data </span>= Encoding.UTF8.GetBytes(Encoding.GetEncoding(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">GB2312</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">).GetString(data));
File.WriteAllBytes(path, data);
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">生成脚本文件</span>
<span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span> Writesql(<span style="color: rgba(0, 0, 255, 1)">string</span> path,<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)"> sql)
{
FileStream fs </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> FileStream(path, FileMode.Create);
StreamWriter sw </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> StreamWriter(fs);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">开始写入</span>
<span style="color: rgba(0, 0, 0, 1)"> sw.Write(sql);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">清空缓冲区</span>
<span style="color: rgba(0, 0, 0, 1)"> sw.Flush();
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">关闭流</span>
<span style="color: rgba(0, 0, 0, 1)"> sw.Close();
fs.Close();
}
}
}</span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p> </p>
<p>五,体验小程序</p>
<p>微信搜索 :<em>DB小阳光</em></p>
<p><em>扫码体验:</em></p>
<p><em><img alt="" width="217" height="217" loading="lazy" src="https://img2020.cnblogs.com/blog/689797/202102/689797-20210221102741155-1422838109.jpg"></em></p>
<p>登录小程序后,发送token至电子邮箱353227876@qq.com</p>
<p>代码已在Gitee开源。</p>
<p>感谢阅读。</p>
<p> </p><br><br>
来源:https://www.cnblogs.com/dabao2021/p/14416334.html
頁:
[1]