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://stackoverflow.com/questions/35296213/read-unicode-string-from-text-file-in-uwp-app/38299563#38299563

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错误的更多相关文章

  1. win10 uwp 读取文本GBK错误

    本文讲的是解决UWP文本GBK打开乱码错误,如何去读取GBK,包括网页GBK.最后本文给出一个方法追加文本. 我使用NotePad记事本保存文件,格式ASCII,用微软示例打开文件方式读取,出现错误 ...

  2. win10 uwp 读取保存WriteableBitmap 、BitmapImage

    我们在UWP,经常使用的图片,数据结构就是 BitmapImage 和 WriteableBitmap.关于 BitmapImage 和 WriteableBitmap 区别,我就不在这里说.主要说的 ...

  3. win10 uwp 读取resw资源文件

    ResourceContext resourceContext = ResourceContext.GetForViewIndependentUse(); ResourceMap resourceMa ...

  4. Win10 UWP系列:关于错误 0x80073CF9及一个小bug的解决

    最近一直在开发XX的uwp版本,也是边摸索边做,最近遇到几个比较奇怪的问题,记录于此. 1.项目可用部署到PC,但无法部署到手机,提示以下错误: 错误 : DEP0001 : 意外错误: Instal ...

  5. win10 uwp 入门

    UWP是什么我在这里就不说,本文主要是介绍如何入门UWP,也是合并我写的博客. 关于UWP介绍可以参见:http://lib.csdn.net/article/csharp/32451 首先需要申请一 ...

  6. win10 uwp 如何开始写 uwp 程序

    本文告诉大家如何创建一个 UWP 程序. 这是一系列的 uwp 入门博客,所以写的很简单 本文来告诉大家如何创建一个简单的程序 安装 VisualStudio 在开始写 UWP 需要安装 Visual ...

  7. Win10 UWP开发系列:实现Master/Detail布局

    在开发XX新闻的过程中,UI部分使用了Master/Detail(大纲/细节)布局样式.Win10系统中的邮件App就是这种样式,左侧一个列表,右侧是详情页面.关于这种 样式的说明可参看MSDN文档: ...

  8. Win10/UWP开发—使用Cortana语音与App后台Service交互

    上篇文章中我们介绍了使用Cortana调用前台App,不熟悉的移步到:Win10/UWP开发—使用Cortana语音指令与App的前台交互,这篇我们讲讲如何使用Cortana调用App的后台任务,相比 ...

  9. 【Win10 UWP】QQ SDK(二):SDK的回调处理

    上一讲,我们介绍了QQ SDK的使用方法,请看<[Win10 UWP]QQ SDK(一):SDK基本使用方法> 一. 回调的基本形式 从前面的介绍中我们知道,我们的应用和QQ客户端之间需要 ...

随机推荐

  1. Leetcode874.Walking Robot Simulation模拟行走的机器人

    机器人在一个无限大小的网格上行走,从点 (0, 0) 处开始出发,面向北方.该机器人可以接收以下三种类型的命令: -2:向左转 90 度 -1:向右转 90 度 1 <= x <= 9:向 ...

  2. 什么是PV UV

    PV是网站分析的一个术语,用以衡量网站用户访问的网页的数量.对于广告主,PV值可预期它可以带来多少广告收入.一般来说,PV与来访者的数量成正比,但是PV并不直接决定页面的真实来访者数量,如同一个来访者 ...

  3. 前端规范1-HTML规范

    HTML规范 1代码风格(参1,) 使用Tab字符(四个空格长度) 层级关系太多时尽量写在一行,但保证每行代码不宜过长  例,代码不宜过长 例,尽量写在一行 2命名(参1,) class必须使用小写, ...

  4. shell脚本练习题(更新中...)

    练习题(这里贴的是自己写的代码, 网上给的题目代码我会附加在最下面) 1. 编写shell脚本,计算1-100的和: #!/bin/bash #caculate the to `; do sum=$[ ...

  5. 解决eclipse不会自动弹出Console控制台的问题

    有时候Eclipse启动,控制台console不会自动跳出来,需要手工点击该选项卡才行, 解决方案: windows  ->   preferences   ->  run/debug   ...

  6. 【NS2】常用资源(转载)

    (一). NS常用基本网站 1. 寻求问题答案最好的地方.    http://mailman.isi.edu/pipermail/ns-users/ 2. 柯老师的网站,包含很多非常实用资源:安装, ...

  7. SDUT-3347_数据结构实验之数组三:快速转置

    数据结构实验之数组三:快速转置 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 转置运算是一种最简单的矩阵运算,对于一个 ...

  8. SDUT-2449_数据结构实验之栈与队列十:走迷宫

    数据结构实验之栈与队列十:走迷宫 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 一个由n * m 个格子组成的迷宫,起 ...

  9. 自动编码(AE)器的简单实现

    一.目录 自动编码(AE)器的简单实现 一.目录 二.自动编码器的发展简述 2.1 自动编码器(Auto-Encoders,AE) 2.2 降噪自编码(Denoising Auto-Encoders, ...

  10. CSS文本超过两行用省略号代替

    1.只显示一行,超出部分用省略号 white-space: nowrap; overflow: hidden; text-overflow: ellipsis; 2.只显示两行(或多行),超出部分用省 ...