【问题标题】:Replace() working with hex valueReplace() 使用十六进制值
【发布时间】:2017-04-05 10:22:37
【问题描述】:

我想使用 Replace() 方法,但使用十六进制值而不是字符串值。

我有一个用 C# 编写文本文件的程序。

我不知道为什么,但是当程序编写“°”(-> 数字)时,它是 °(十六进制:C2 B0 而不是 B0)。

我只是想修补它,以纠正这个问题。

是否可以进行替换以将 C2B0 替换为 B0 ?这是怎么做的?

非常感谢:)

【问题讨论】:

  • 为什么Replace() 不起作用? yourString.Replace((char)0xC2B0, (char)0xB0);
  • 这里的“十六进制”是什么意思并不清楚。如果您的意思是在将其视为 binary 时是文本文件中的数据,那么您可能应该将数据视为二进制开始。我的猜测是您实际上并不是指U+C2B0
  • 这不是替代品,而是编码(Unicode ANSI)问题。哪个应用程序将此呈现为“°”?您能否展示一个写入文件的代码的最小示例?
  • 程序只需使用 File.WriteAllText() 将 DataTable 内容写入文本。
  • 当你看到重音 A 时,你应该立即想到“utf8 !”是的,° 字符的 utf-8 编码确实是 0xC3 0xB0。不要修复它,utf-8 很好,只要确保你用来查看文件的任何程序都理解它是 utf-8。这可能需要生成 BOM,将 new UTF8Encoding(true) 传递给 StreamWriter 构造函数。如果你真的,真的讨厌它然后通过 Encoding.Default.

标签: c# .net hex culture


【解决方案1】:

不确定这是否是您问题的最佳解决方案,但如果您想要使用十六进制值的字符串的替换功能,这将起作用:

var newString = HexReplace(sourceString, "C2B0", "B0");


    private static string HexReplace(string source, string search, string replaceWith) {
        var realSearch = string.Empty;
        var realReplace = string.Empty;

        if(search.Length % 2 == 1) throw new Exception("Search parameter incorrect!");

        for (var i = 0; i < search.Length / 2; i++) {
            var hex = search.Substring(i * 2, 2);
            realSearch += (char)int.Parse(hex, System.Globalization.NumberStyles.HexNumber);
        }
        for (var i = 0; i < replaceWith.Length / 2; i++) {
            var hex = replaceWith.Substring(i * 2, 2);
            realReplace += (char)int.Parse(hex, System.Globalization.NumberStyles.HexNumber);
        }

        return source.Replace(realSearch, realReplace);
    }

【讨论】:

    【解决方案2】:

    C# 字符串是 Unicode。将它们写入文件时,必须应用编码。 File.WriteAllText 使用的默认编码是utf-8 with no byte order mark

    两字节序列0xC2B0是°度符号U+00B0码点in utf-8的表示。

    要去掉 0xC2 部分,请应用不同的编码,例如 latin-1:

    var latin1 = Encoding.GetEncoding(1252);
    File.WriteAllText(path, text, latin1);
    

    要解决问题的“十六进制替换”想法:从现有文件中删除 utf-8 前导字节的最佳做法是使用 utf-8 执行 ReadAllText,然后是 WriteAllText,如上所示(如果文件太大而无法整体读取到内存中,则使用流分块)。

    单字节字符编码不能代表所有 Unicode 字符,因此 DataTable 中的任何此类字符都会发生替换。

    必须将 ° 的再现归咎于您用于显示文件的查看器/编辑器。

    延伸阅读:https://stackoverflow.com/a/17269952/1132334

    【讨论】:

      猜你喜欢
      • 2018-07-26
      • 1970-01-01
      • 2014-11-30
      • 1970-01-01
      • 2020-10-25
      • 2013-06-10
      • 2014-02-18
      • 1970-01-01
      相关资源
      最近更新 更多