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客户端之间需要 ...
随机推荐
- springboot整合neo4j
刚开始按网上博客搭建 spring boot 和 neo4j一直报sessionFactory找不到,直到下载了spring-data-neo4j的实例demo对比才搭建成功,而且用户名是neo4j, ...
- 介绍vue项目中的axios请求(get和post)
一.先安装axios依赖,还有qs依赖 npm install axios --save npm install qs --save qs依赖包用post请求需要用到的 插入一个知识点: npm in ...
- npm上面实用的第三方工具包
npm上面实用的第三方工具包 live-server 作用:为页面提供实时刷新重载的功能,并且能提供一个http服务器 官方地址:https://www.npmjs.com/package/live- ...
- text-align:justify在项目中碰到的问题
最近在项目中,使用了一个新的样式属性:text-align:justigy,这个属性在使用过程中遇到了一些小异常,现在总结下. text-align有一个属性值为justify,为对齐之意.其实现的 ...
- 基于TCP编程的socket
什么是TCP/IP.UDP? TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域 ...
- NOIP2016提高A组模拟9.28总结
这次三道题都是可以AC的. 每道题思路都正确,但每道题都有细节没有注意. 第一题 1.没注意系数为1时可以省略系数: 2.没注意在第一项处理常数后,不能输出+号. 导致丢失20分:一定要多出特殊数据, ...
- xml入门与解析
xml入门与解析 1.xml基础知识 xml:可扩展的标签语言,标签自定义. 作用:存储数据.(配置文件) 书写规范: 1.区分大小写 2.应该有一个根标签 3.标签必须关闭 <xx>&l ...
- springboot 启动配置原理【转】【补】
创建应用 几个重要的事件回调机制 , 配置在META-INF/spring.factories ApplicationContextInitializer SpringApplicationRunL ...
- NSString&NSMutableString常用操作梳理
http://www.cocoachina.com/ios/20150724/12722.html 上一篇梳理了NSArray&NSMutableArray常用操作,这次来梳理一下Object ...
- Java面向对象----Java面向对象(OOP)概念
理解面向对象 关键:让每一个对象负责执行一组相关任务 面向过程:算法第一,数据第二 面向对象:数据第一,算法第一 特点: 万物皆对象 程序是一组对象彼此之间在发送消息 每个对象都有自己的内存占用,可以 ...