【问题标题】:Carriage return (/r) missing when encoding and decoding a string using c#使用 c# 编码和解码字符串时缺少回车符 (/r)
【发布时间】:2018-11-27 02:01:25
【问题描述】:

我有以下字符串:

This is the string to
test carriage return
using c#

上面的字符串在行尾有两个回车符。我必须对该字符串进行编码以传递给 WCF 服务,然后对该字符串进行解码以进行进一步处理。

//TO ENCODE
            byte[] bytes = Encoding.Default.GetBytes(rawstring);
            string encodedStr = Encoding.UTF8.GetString(bytes);


//TO DECODE
            byte[] rawUtf8EncodedData = Encoding.Default.GetBytes(encodedstring);
            string decodedStr =  Encoding.UTF8.GetString(rawUtf8EncodedData);

编码后我得到以下字符串:

This is the string to\ntest carriage return\nusing c#

解码后我得到以下字符串:

This is the string to\ntest carriage return\nusing c#

问题是,由于某种原因,我需要回车,而不是解码后字符串中的 \n。我怎样才能做到这一点?以上字符串仅作说明,实际字符串中会有很多回车符和符号

【问题讨论】:

  • 如果您在调试器中查看字符串,它将显示\n 而不是回车。尝试将字符串输出到控制台或日志文件,看看是否有回车。
  • 我正在使用这个字符串来做一些逻辑,如果有 \n 就会失败。它需要回车才能工作。现在它失败了,因为 \n 存在于原始字符串中。
  • 你在哪里“有以下字符串”?行尾可以用多种方式编码
  • 刚刚测试过(可以肯定)。插入\r\n\r\n,都作为原始返回。 [the] 字符串有两个回车符 是什么意思?你是从RichTextBox 中提取这个字符串吗?。

标签: c# .net string carriage-return


【解决方案1】:

这是错误的:

byte[] bytes = Encoding.Default.GetBytes(rawstring);
string encodedStr = Encoding.UTF8.GetString(bytes);

第一行使用默认编码获取字节。在 .Net Core 上,它是 UTF-8,您可能没问题,但在 Windows 上,它是来自操作系统的系统代码页,可能是任何东西

然后,第二行代码将这些字节视为已经采用 UTF-8 格式,无论您实际得到什么。这可能适用于很多字符串,但最终它会失败。此外,结果仍然是一个 .Net 字符串,它是内部的 Unicode (UTF-16) 编码......所以你最终得到的仍然是 UTF-16,不是 UTF-8

如果您需要将 UTF-8 字符串发送到网络服务,请使用 Encoding.UTF8.GetBytes() 获取 UTF-8 字节,然后将字节作为字符串发送。

【讨论】:

  • 当然。对于非常有限的字符子集,此转换 不会失败。取决于本地编码,可能没有。在这些有限的 CodePoints 之外,你会得到 garbage
【解决方案2】:

用 \r\n 替换 \n 效果很好

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-06
    • 1970-01-01
    • 2012-07-05
    • 2014-12-31
    • 1970-01-01
    • 2017-11-01
    • 1970-01-01
    相关资源
    最近更新 更多