2019-8-24-win10-uwp-读取文本GBK错误
| title | author | date | CreateTime | categories |
|---|---|---|---|---|
|
win10 uwp 读取文本GBK错误
|
lindexi
|
2019-8-24 16:2:27 +0800
|
2018-2-13 17:23:3 +0800
|
Win10 UWP
|
本文讲的是解决UWP文本GBK打开乱码错误,如何去读取GBK,包括网页GBK。最后本文给出一个方法追加文本。
我使用NotePad记事本保存文件,格式ASCII,用微软示例打开文件方式读取,出现错误
“在多字节的目标代码页中,没有此 Unicode 字符可以映射到的字符”
英文 No mapping for the Unicode character exists in the target multi-byte code page
这个问题看来很简单,不就是编码错误,最后我就弄了一晚上
我先换个说法,让大家容易搜索到
UWP 读ASCII错误
UWP read ASCII
UWP GBK
UWP 读取记事本
UWP 访问GBK网页乱码
UWP 乱码
UWP GB2312 乱码
UWP 网页乱码
其实不知道垃圾wr怎么想,现在没法读ASCII,把文本用文本编辑器打开,另存为的时候保存为 ASCII 格式,使用官方给的代码,直接错。
用了nos大神的代码http://blog.csdn.net/nomasp/article/details/50310357,也是报错
用了我csdn博客置顶代码,就直接乱码 所有中文为 "?" ,但是我以前就是这样写,可以读取到?原因是因为文本保存为
查了一下WPF使用默认可以读,原因是默认的 WPF 的编码读取是 GBK 所以这时就可以读取,但是在 UWP 是没有 GBK 的,默认也不是。因为 UWP 是 .net core 程序,.net core 没有默认支持 GBK ,因为 .net core 是最小化的,
从微软的文档可以看到下面的说明
By default, .NET Core does not make available any code page encodings other than code page 28591 and the Unicode encodings, such as UTF-8 and UTF-16. However, you can add the code page encodings found in standard Windows apps that target .NET to your app. For complete information, see the CodePagesEncodingProvider topic.
默认.net core 不包含除了 代码页为 28591 和 Unicode(utf-8,utf-16) 之外的其他编码,但是标准的 .net Framework 开发的程序中使用其他的编码,而且可以在标准的 windows 程序支持其他编码,详细请看CodePagesEncodingProvider
也就是我们保存时GBK,查询到Encoding没有GBK,没有默认的,所以看起来这个问题不是简单就可以通过。
于是我就在网上找,很久没找到,但是找到 http://www.cnblogs.com/yffswyf/p/4826207.html,写到一半我就不想写,好难
在网上看到Encoding.GetEncoding(0)就是默认编码,于是我找了 GetEncoding,原来有string,那么Encoding gbk = Encoding.GetEncoding("GBK");是否就是可以,运行代码
报错
'GBK' is not a supported encoding name.
看来这个也不可以,我觉得我要写个转换
最后发现
https://bbs.uwp.ac.cn/?/article/43 有大神的方法,请看下面代码。
//使用CodePagesEncodingProvider去注册扩展编码。
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
//注册GBK编码
Encoding encodingGbk = Encoding.GetEncoding("GBK");
如果找不到 CodePagesEncodingProvider ,请在nuget搜索System.Text.Encoding.CodePages,如果找不到 GBK ,那么请使用 GB3212 代替。
我们在读取之前判断文件的编码,按照不同编码进行不同编码的读取,这个简单判断可以使用这段代码判断
private static Encoding AutoEncoding(byte[] bom)
{
if (bom.Length != 4)
{
throw new ArgumentException();
}
// Analyze the BOM
if (bom[0] == 0x2b && bom[1] == 0x2f && bom[2] == 0x76) return Encoding.UTF7;
if (bom[0] == 0xef && bom[1] == 0xbb && bom[2] == 0xbf) return Encoding.UTF8;
if (bom[0] == 0xff && bom[1] == 0xfe) return Encoding.Unicode; //UTF-16LE
if (bom[0] == 0xfe && bom[1] == 0xff) return Encoding.BigEndianUnicode; //UTF-16BE
if (bom[0] == 0 && bom[1] == 0 && bom[2] == 0xfe && bom[3] == 0xff) return Encoding.UTF32;
return Encoding.ASCII;
}
这没有GBK所以我们只好通过一个垃圾方法。
用Windows.Storage.FileIO.ReadTextAsync如果错误了,就使用GBK读,还错误,那么就是文件错了。
编码的错报的ArgumentOutOfRangeException。我们可以Catch,用GBK读文本,这样如果读取错误就是文件错了。
全部代码
private async Task<string> Read(StorageFile file)
{
string str = "";
try
{
str = await Windows.Storage.FileIO.ReadTextAsync(file);
}
catch (ArgumentOutOfRangeException)
{
//using(var stream =new StreamReader((await file.OpenReadAsync()).GetInputStreamAt(0).AsStreamForRead()))
//{
// string text = stream.ReadToEnd();
// return text;
//} IBuffer buffer = await FileIO.ReadBufferAsync(file);
DataReader reader = DataReader.FromBuffer(buffer);
byte[] fileContent = new byte[reader.UnconsumedBufferLength];
reader.ReadBytes(fileContent);
string text = ""; // Encoding.ASCII.GetString(fileContent, 0, fileContent.Length); //text= Encoding.GetEncoding(0).GetString(fileContent, 0, fileContent.Length); Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
Encoding gbk = Encoding.GetEncoding("GBK"); text = gbk.GetString(fileContent);
//string text = AutoEncoding(new byte[4] { fileContent[0], fileContent[1], fileContent[2], fileContent[3] }).GetString(fileContent); return text;
}
return str;
} private static Encoding AutoEncoding(byte[] bom)
{
if (bom.Length != 4)
{
throw new ArgumentException();
}
// Analyze the BOM
if (bom[0] == 0x2b && bom[1] == 0x2f && bom[2] == 0x76) return Encoding.UTF7;
if (bom[0] == 0xef && bom[1] == 0xbb && bom[2] == 0xbf) return Encoding.UTF8;
if (bom[0] == 0xff && bom[1] == 0xfe) return Encoding.Unicode; //UTF-16LE
if (bom[0] == 0xfe && bom[1] == 0xff) return Encoding.BigEndianUnicode; //UTF-16BE
if (bom[0] == 0 && bom[1] == 0 && bom[2] == 0xfe && bom[3] == 0xff) return Encoding.UTF32;
return Encoding.ASCII;
}
http://www.cnblogs.com/loyieking/p/5617508.html
难道.NET Core到R2连中文编码都不支持吗? - Artech - 博客园
文本还有一个坑,我们如何在文本追加?uwp追加文本其实换了类,在FileIO。
对于一个需要追加的文件,UWP追加文件写入其实可以使用await FileIO.AppendTextAsync(StorageFile,"追加文本");
2019-8-24-win10-uwp-读取文本GBK错误的更多相关文章
- win10 uwp 读取文本GBK错误
本文讲的是解决UWP文本GBK打开乱码错误,如何去读取GBK,包括网页GBK.最后本文给出一个方法追加文本. 我使用NotePad记事本保存文件,格式ASCII,用微软示例打开文件方式读取,出现错误 ...
- win10 uwp 读取保存WriteableBitmap 、BitmapImage
我们在UWP,经常使用的图片,数据结构就是 BitmapImage 和 WriteableBitmap.关于 BitmapImage 和 WriteableBitmap 区别,我就不在这里说.主要说的 ...
- win10 uwp 读取resw资源文件
ResourceContext resourceContext = ResourceContext.GetForViewIndependentUse(); ResourceMap resourceMa ...
- Win10 UWP系列:关于错误 0x80073CF9及一个小bug的解决
最近一直在开发XX的uwp版本,也是边摸索边做,最近遇到几个比较奇怪的问题,记录于此. 1.项目可用部署到PC,但无法部署到手机,提示以下错误: 错误 : DEP0001 : 意外错误: Instal ...
- win10 uwp 入门
UWP是什么我在这里就不说,本文主要是介绍如何入门UWP,也是合并我写的博客. 关于UWP介绍可以参见:http://lib.csdn.net/article/csharp/32451 首先需要申请一 ...
- win10 uwp 如何开始写 uwp 程序
本文告诉大家如何创建一个 UWP 程序. 这是一系列的 uwp 入门博客,所以写的很简单 本文来告诉大家如何创建一个简单的程序 安装 VisualStudio 在开始写 UWP 需要安装 Visual ...
- Win10 UWP开发系列:实现Master/Detail布局
在开发XX新闻的过程中,UI部分使用了Master/Detail(大纲/细节)布局样式.Win10系统中的邮件App就是这种样式,左侧一个列表,右侧是详情页面.关于这种 样式的说明可参看MSDN文档: ...
- Win10/UWP开发—使用Cortana语音与App后台Service交互
上篇文章中我们介绍了使用Cortana调用前台App,不熟悉的移步到:Win10/UWP开发—使用Cortana语音指令与App的前台交互,这篇我们讲讲如何使用Cortana调用App的后台任务,相比 ...
- 【Win10 UWP】QQ SDK(二):SDK的回调处理
上一讲,我们介绍了QQ SDK的使用方法,请看<[Win10 UWP]QQ SDK(一):SDK基本使用方法> 一. 回调的基本形式 从前面的介绍中我们知道,我们的应用和QQ客户端之间需要 ...
随机推荐
- SPSS操作:轻松实现1:1倾向性评分匹配(PSM)
SPSS操作:轻松实现1:1倾向性评分匹配(PSM) 谈起临床研究,如何设立一个靠谱的对照,有时候成为整个研究成败的关键.对照设立的一个非常重要的原则就是可比性,简单说就是对照组除了研究因素外,其他的 ...
- 可变参数与foreach 的原理
曾经写过c++11特性使用,但是这个究竟是什么呢,和其他语言的foreach语句十分相像 函数必须具有在编译时已知的单个返回类型;当编译器可以从上下文中找出它必须是什么时,auto只会使您不必输入它. ...
- 【Leetcode链表】分隔链表(86)
题目 给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前. 你应当保留两个分区中每个节点的初始相对位置. 示例: 输入: head = 1->4 ...
- poj 2229 【完全背包dp】【递推dp】
poj 2229 Sumsets Time Limit: 2000MS Memory Limit: 200000K Total Submissions: 21281 Accepted: 828 ...
- InteractiveHtmlBom 在手机上无法显示 BOM List 和装配图的问题
InteractiveHtmlBom 在手机上无法显示 BOM List 和装配图的问题 InteractiveHtmlBom 插件是一款用于 KiCad BOM 装配图生成插件. 最近新生成的 文件 ...
- sql —— order by
用于对结果集进行排序. 原表: 根据成绩这列数据进行升序排序: 根据成绩这列数据进行降序排序:
- sql表连接 —— join
一.内连接 —— INNER JOIN 内连接是最常见的一种连接,只连接匹配的行. 表1: 表2: 执行查询: select StudentId as 学生编号,StudentName as 姓名,G ...
- C#面向对象基础 —— 类与对象
文章来源: https://www.cnblogs.com/huluobozu/p/5070500.html 一.类与对象 类是面向对象编程的基本单元:类造出来的变量叫对象. 一个类包含俩种成员:字段 ...
- input禁止复制、粘贴、剪切
<input type="text" autocomplete="off"> <!-- autocomplete="off" ...
- Ubuntu+Apache+PHP+Mysql环境搭建(完整版)(转)
http://www.2cto.com/os/201505/401588.html Ubuntu+Apache+PHP+Mysql环境搭建(完整版) 一.操作系统Ubuntu 14.04 64位,阿里 ...