我有一个asp.net c#页面,正在尝试读取一个包含以下字符的文件 ’,并将其转换为' (从倾斜的撇号到撇号)。
FileInfo fileinfo = new FileInfo(FileLocation);
string content = File.ReadAllText(fileinfo.FullName);
//strip out bad characters
content = content.Replace("’", "'");
这不起作用,并且将倾斜的撇号变成了问号标记。
我有一个asp.net c#页面,正在尝试读取一个包含以下字符的文件 ’,并将其转换为' (从倾斜的撇号到撇号)。
FileInfo fileinfo = new FileInfo(FileLocation);
string content = File.ReadAllText(fileinfo.FullName);
//strip out bad characters
content = content.Replace("’", "'");
这不起作用,并且将倾斜的撇号变成了问号标记。
我怀疑问题并不在于替换,而是在于读取文件本身。我以前尝试过一种简单粗暴的方法(使用Word和复制粘贴),结果也和您一样得到了相同的结果,但检查 content
后发现 .Net 框架认为该字符是 Unicode 字符 65533
,即在字符串替换之前的“WTF?”字符。您可以通过检查 Visual Studio 调试器中的相关字符来验证这一点,它应该显示字符代码:
content[0]; // 65533 '�'
replace方法无法正常工作的原因很简单 - content
不包含您提供的字符串:
content.IndexOf("’"); // -1
如果文件读取不正常,可能是因为在读取文件时使用了错误的编码方式。(如果未指定编码,则 .Net 框架将尝试为您确定正确的编码方式,但没有 100% 可靠的方法可以做到这一点,因此往往会出现错误)。您需要使用的确切编码方式取决于文件本身,但在我的情况下使用的编码方式是Extended ASCII,因此我只需要指定正确的编码方式即可读取该文件:
string content = File.ReadAllText(fileinfo.FullName, Encoding.GetEncoding("iso-8859-1"));
(请参考这个问题。)
当在代码中使用“奇怪”的字符时,您需要确保在替换字符串中指定正确的字符 - 您可以通过字符编码而不是字符串字面量来指定字符,这样可能更可靠(如果源文件的编码发生变化,则字符串字面量可能会导致问题)。例如,以下内容对我有效:
content = content.Replace("\u0092", "'");
(char)146
,使用'\u0092'
可能更易读,因为它与字符代码表匹配。 - Jeffrey L Whitledge'\u0092' == (char)146
的原因是 \u
表示法使用十六进制,而 0x92 == 146
。 - Justin//Specify Windows-1252 here
string content = File.ReadAllText(fileinfo.FullName, Encoding.GetEncoding(1252));
//Your replace code will then work as is
content = content.Replace("’", "'");
// This should replace smart single quotes with a straight single quote
Regex.Replace(content, @"(\u2018|\u2019)", "'");
//However the better approach seems to be to read the page with the proper encoding and leave the quotes alone
var sreader= new StreamReader(fileInfo.Create(), Encoding.GetEncoding(1252));