我想使用Replace()方法,但使用十六进制值而不是字符串值。替换()使用十六进制值
我有一个在C#中编写文本文件的程序。
我不知道为什么,但是当程序写入'°'( - >数字)时,它就是°(十六进制:C2 B0而不是B0)。
我只是想修补它,为了解决这个问题。
为了用B0代替C2B0可以做替换吗?如何做到这一点?
感谢很多:)
我想使用Replace()方法,但使用十六进制值而不是字符串值。替换()使用十六进制值
我有一个在C#中编写文本文件的程序。
我不知道为什么,但是当程序写入'°'( - >数字)时,它就是°(十六进制:C2 B0而不是B0)。
我只是想修补它,为了解决这个问题。
为了用B0代替C2B0可以做替换吗?如何做到这一点?
感谢很多:)
不知道这是你的问题的最佳解决方案,但如果你想使用十六进制值的字符串替换功能,这将工作:
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);
}
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中的任何此类字符都会发生替换。
作为°的演绎必须归咎于您用来显示文件的查看器/编辑器。
为什么不'替换()'工作? 'yourString.Replace((char)0xC2B0,(char)0xB0);' – Equalsk
这里不清楚“in hex”是什么意思。如果你的意思是这个文本文件中的数据被认为是* binary *,那么你应该把数据视为二进制文件来开始。我的猜测是,你实际上并不意味着[U + C2B0](http://www.fileformat.info/info/unicode/char/c2b0/index.htm)。 –
这不是替代品的候选对象,而是编码(Unicode <> ANSI)问题。哪个应用程序将其渲染为“°”?你能展示一个写入文件的代码的最小例子吗? – dlatikay