2017-04-05 85 views
0

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

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

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

我只是想修补它,为了解决这个问题。

为了用B0代替C2B0可以做替换吗?如何做到这一点?

感谢很多:)

+0

为什么不'替换()'工作? 'yourString.Replace((char)0xC2B0,(char)0xB0);' – Equalsk

+0

这里不清楚“in hex”是什么意思。如果你的意思是这个文本文件中的数据被认为是* binary *,那么你应该把数据视为二进制文件来开始。我的猜测是,你实际上并不意味着[U + C2B0](http://www.fileformat.info/info/unicode/char/c2b0/index.htm)。 –

+0

这不是替代品的候选对象,而是编码(Unicode <> ANSI)问题。哪个应用程序将其渲染为“°”?你能展示一个写入文件的代码的最小例子吗? – dlatikay

回答

0

不知道这是你的问题的最佳解决方案,但如果你想使用十六进制值的字符串替换功能,这将工作:

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); 
    } 
0

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

双字节序列0xC2B0是度度标记U + 00B0码点in utf-8的表示。

要摆脱为0xC2部分,采用不同的编码,例如拉丁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