【问题标题】:How do I read hex sequences like xD0 into a C# string?如何将 xD0 等十六进制序列读入 C# 字符串?
【发布时间】:2014-10-16 01:08:18
【问题描述】:

我正在将一系列旨在使用特殊字体正确显示的字符串转换为可在任何地方使用的 unicode 版本。这只是一组美化的字符串替换:

"e]" -> "ἓ"

等等

我正在使用将编码设为 UTF-8 的流式阅读器阅读文本。一切运作良好。但是有一些用于替换标点符号的字符不起作用。我可以在 notepad++ 中将它们视为十六进制序列(编码设置为 UTF-8),但是当我阅读它们时,它们都被简化为相同的字符(黑色菱形中的“无法显示”问号)。

StreamReader srnorm = new StreamReader("C:\\Users\\John\\Desktop\\bgt.txt", Encoding.UTF8);
string norm = srnorm.ReadLine();

我应该将它作为二进制文件读取并从那里工作还是我的编码非常错误?

(Full size image) 当我读到它时,我得到以下信息:

o]j ouvci。嗯。 'avpo'la,bh| pollaplasi,ona evn tw/|凯尔/|头,tw|凯。 evn tw/| aivw/ni tw/| evrcome,nw| zwh.n aivw,nion。

【问题讨论】:

  • 您好,欢迎来到 Stack Overflow。请阅读有关提问的 Stack Overflow 帮助,以确保您的问题获得最佳答案的可能性最高。特别是:带有描述的代码很棒。没有描述的代码是可以通过的。没有代码的描述几乎是无用的。你能编辑你的问题并向我们展示你在做什么吗?
  • 嗨@Amadan,我不确定要添加什么。我可以向您展示我的流式阅读器创建和 ReadLine(),但我认为它不会那么有启发性。我已经添加了我的 ReadLine 产生的字符串。
  • 谢谢,它变得越来越清晰(而且比抱歉更安全)。我收集了bgt.txt 转换后的文件? 0xCE0xC50xD0 不是有效的 UTF-8。
  • 源可以选择导出为 .txt。它还允许导出到 .rtf,从而在 .rtf 文件中生成类似 \'c5 的序列。如果不是有效的 UTF-8,是不是编码错误?
  • 可能编码错误,是的。 “源可以选择导出......”是什么意思?你是如何生成文件的,它的编码是什么?

标签: c# encoding utf-8


【解决方案1】:

C# 字符串使用 UTF-16。这就是它们在内存中的存储方式。因此,您应该能够将字符串读入内存并替换字符而不会出现任何问题。然后,您可以将这些字符写回文件(如果我没记错的话,UTF8 是读取和写入文件的默认字符编码)。 ? 只是表示您将字符串输出到的控制台不支持这些字符或字节不是有效的编码。

这是 Jon Skeet 关于 C#/.NET 字符串的a good article

【讨论】:

  • 注意二进制表示:0xCE 本身是 UTF-8 编码的有效字符。
  • 更具体地说,如果是UTF-8,它将是一个两字节序列的第一个字节,后面的字符需要在0x800xBF之间;但后面的字符是“a”(0x61)。
  • 这是否意味着我应该使用 BinaryReader 而不是尝试作为文本?
  • @Amadan 我想向 user4147820 解释的是,不必使用二进制阅读器读取 unicode 文件,C# 字符串可以存储 unicode 字符。您只需要确保您正在使用正确的编码读取文件(并且文件没有损坏)。
  • 当我读为 UTF-16 时,所有问题字符都减少到 0xFF(字节 1:253,字节 2:255)。
猜你喜欢
  • 2018-01-31
  • 1970-01-01
  • 2019-07-27
  • 2019-02-21
  • 2013-05-03
  • 2017-08-23
  • 2014-03-19
  • 1970-01-01
相关资源
最近更新 更多