【问题标题】:C# metro No mapping for the Unicode character exists in the target multi-byte code pageC# metro 目标多字节代码页中不存在 Unicode 字符的映射
【发布时间】:2014-08-05 03:52:10
【问题描述】:

行:

IList<string> text = await FileIO.ReadLinesAsync(file);

导致异常No mapping for the Unicode character exists in the target multi-byte code page

当我从文件中删除像 ąśźćóż 这样的字符时,它运行正常,但问题是我不能保证这些字符将来不会发生。

我尝试在高级保存选项中更改编码,但它已经是

Unicode (UTF-8 with signature) - Codepage 65001

我很难弄清楚这一点。

【问题讨论】:

  • 请提供显示问题的内联小示例文件(如十六进制中的 10-20 字节)。否则无法提出任何建议。
  • i.imgur.com/vWyXj2O.png你是这个意思吗?
  • 有点像。 “内联”就像“编辑帖子并将数据作为文本”。您的示例文件没有具有 BOM(尽管您声称您已使用“带有签名的 Utf8”保存它),它可能使用其他编码(可能不是 Utf8)。在使用 BOM 读取文件或使用 Utf8 重新保存文件时显式修复指定编码。
  • 我指定,我想明确使用 UTF8 编码,但它不会改变任何事情。虽然你是对的,但当我将文件保存为 UTF8 时它可以正常工作,但我不能这样做,因为我无法控制将提供给程序的内容。让我明白的是,当我将普通 File 与控制台应用程序一起使用时,它就像一个魅力,但与 FileIO 和存储应用程序一起使用它会失败

标签: c# unicode windows-store-apps


【解决方案1】:

我认为那些字符ąśźćóż 是 UTF-16 编码的。所以,最好使用 UTF-16。使用重载ReadLinesAsync(IStorageFile, UnicodeEncoding)并将UnicodeEncdoing参数设置为UnicodeEncoding.Utf16BE

来自 MSDN:

此方法使用指定文件的字符编码。如果你 要指定不同的编码,请调用 ReadLinesAsync(IStorageFile, UnicodeEncoding) 代替。

【讨论】:

  • 这有点令人困惑,我讨厌编码问题。我在 StackOverFlow 上看到了 this。我希望那里建议的解决方案可以解决问题
【解决方案2】:

使FileIO.ReadLinesAsync 使用匹配的编码。我不知道您的自定义类做了什么,但根据错误消息它不使用任何 Unicode 编码。

【讨论】:

  • 我的班级只是从文件中读取并将其行保存到列表中。我确实尝试强制使用 UTF-8 编码,但它没有帮助。 pastebin.com/Ph6GKa1K这就是全部
  • 我需要看看FileIO.ReadLinesAsync
  • 我没有看到您指定了编码。试试这个重载:msdn.microsoft.com/en-us/library/windows/apps/hh701479.aspx 并使用正确的编码,如果我们可以信任您的文本编辑器,它将是 UTF-8。
  • 我想看看。你永远不知道你会找到什么。使用带有 BOM 标头的 UTF-8。我不知道如何用 WinRT 做到这一点,但它确实是可能的。下一个测试:确保使用 UTF8 和 UTF16 产生不同的字符串只是为了确保编码“接受”。
猜你喜欢
  • 2017-03-21
  • 2013-08-14
  • 2014-11-21
  • 1970-01-01
  • 2014-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-13
相关资源
最近更新 更多