文章目录
- 更改编码重新载入
- 自动编码检测
- 更改编码并保存
txt阅读器系列:
- 需求分析和文件读写
- 目录提取类💎列表控件与目录💎快捷键翻页
- 字体控件绑定💎前景/背景颜色
- 书籍管理系统💎用树形图管理书籍
- 语音播放💎播放进度显示💎快进快退💎语速音量
- 文本清理的布局💎段落合并
更改编码重新载入
在文本清洗
的Expander
下预留了文件编码设置的选项,首先设置其内容,前端代码为
<ComboBox x:Name="cbEncoding"/>
相应地在初始化代码中添加
cbEncoding.ItemsSource = Encoding.GetEncodings()
.Select(x => x.Name);
cbEncoding.SelectedIndex = 0;
由于引入了编码方式,所以需要修改打开txt
文件的逻辑,其打开方式为
string filePath; // 全局变量
private void openFile()
{
gbTxt.Header = System.IO.Path.GetFileName(filePath);
doc = File.ReadAllText(filePath,
Encoding.GetEncoding(cbEncoding.SelectedItem.ToString()));
txtChange(doc[..200]); // 这时很早之前写的更改txt控件内容的代码
}
然后将所有涉及到打开文本文档的地方,都更改为openFile
的方法,主要在btnOpenTxt_Click
和tvBookShelf_SelectedItemChange
这两处。
接下来写重载按钮的逻辑,其xaml
代码为
<Button Content="重载" DockPanel.Dock="Right" Click="btnReload_Click"/>
相应地btnReload_Click
内容如下
private void btnReload_Click(object sender, RoutedEventArgs e)
{
openFile();
}
效果如下
自动编码检测
GetEncodings
得到的编码并不全,连gb2312
这么常见的中文编码都没有。而且一个编码一个编码挨个试也太麻烦。故而推荐使用UTF.Unknow
包:在NuGet管理器中下载并安装,并添加引用
using UtfUnknown;
然后修改openFile
函数
Encoding nowEncoding = Encoding.UTF8;
private void openFile(string codeMode = "auto")
{
nowEncoding = codeMode == "combo"
? Encoding.GetEncoding(cbEncoding.SelectedItem.ToString())
: CharsetDetector.DetectFromFile(filePath).Detected.Encoding;
txtInfo.AppendText($"{System.IO.Path.GetFileName(filePath)}" +
$"编码为:{nowEncoding.EncodingName}\r\n");
gbTxt.Header = System.IO.Path.GetFileName(filePath);
doc = File.ReadAllText(filePath, nowEncoding);
txtChange(doc[..200]);
}
其中,nowEncoding
是全局变量,表示当前打开文件的编码。
CharsetDetector.DetectFromFile(filePath).Detected.Encoding
就是根据文件路径,所自动检测到的编码。为了不影响重载
功能,将重载按钮中调用的openFile
添加一个codeMode
参数:openFile("combo")
。
这回再打开文件,效果如下
更改编码并保存
有了自动判断编码的神器,那么重新载入的意义也就不大了,但文件转码还是比较有意义的,接下来新建一个saveFile
函数
Encoding nowEncoding = Encoding.UTF8;
private void saveFile(string codeMode = "now")
{
var sfd = new SaveFileDialog();
sfd.Filter = "文本文件(*.txt)|*.txt";
if (sfd.ShowDialog() != true) return;
Encoding e = codeMode == "combo"
? Encoding.GetEncoding(cbEncoding.SelectedItem.ToString())
: nowEncoding;
txtInfo.AppendText($"存储文件{System.IO.Path.GetFileName(sfd.FileName)}" +
$"编码为:{nowEncoding.EncodingName}\r\n");
File.WriteAllText(sfd.FileName, doc, e);
}
然后修改工具栏的保存
按钮,将其内容改为
private void btnSaveTxt_Click(object sender, RoutedEventArgs e)
{
saveFile("now");
}
并为文本设置
中的另存按钮注册事件
private void btnSaveAs_Click(object sender, RoutedEventArgs e)
{
saveFile("combo");
}