将字符串中的单引号转义为转义字符的单引号

43

很抱歉我要问这个问题,但是由于某些原因我一直没能让它正常工作(是的,现在已经很晚了,这就是我的借口)。

假设我有这个字符串:

s = "John's book."

我想使用字符串对象的 replace 方法将它转换为这样:

s = "John\'s book."

我本以为这段代码可以给我想要的结果:

s = s.Replace("'", "\\'")

但是,这会导致:

"John\\'s book."

1
你现在所做的看起来应该是可以工作的。那个调试器给出的结果吗?我认为 VS 会“帮忙”通过显示 '\' 来代替 ''. - SirPentor
@SirPentor - 的确。我本来就是对的,但是调试器显示了一个不同的值。 - Justin Helgerson
这是在搜索引擎“C#转义单引号”的前两名之一...在C#中转义字符串的规范问题是什么?它绝对存在。候选问题:*我可以转义一个文本字符串文字中的双引号吗?*(因为答案涵盖了大多数情况,而外部参考资料则涵盖了其他情况)。 - Peter Mortensen
5个回答

89

这样做可以让你不必再考虑它:

s = s.Replace("'", @"\'");

我之前尝试过那个方法,但也没有起作用。结果是:John\\'s book. - Justin Helgerson
9
我认为你可能只是在调试器/检查器中查看它,这将显示转义后的内容(两次),但如果你使用Console.Write(),它应该输出正确的结果。 - lukiffer
1
你可能正在调试并通过在Visual Studio中悬停在s上来查看结果... 是的,这样显示转义字符是正确的。但是,如果你在某个地方输出该字符串(如文本框或控制台),它将只显示一个反斜杠。 - BeemerGuy
有人愿意修改这个代码并解释为什么字面量可以工作而标准字符串表示法却不行吗? - Manuel Hernandez
2
@manuelhe; s.Replace("'", @"\'");s.Replace("'", "\\'"); 都会得到相同的结果 -- 区别在于调试器本身;它将字符串值显示为 "John\\'s book.",多了一个斜杠。但如果你在控制台或文件中输出这个字符串,你会看到真正的结果是 "John\'s book." - BeemerGuy
显示剩余2条评论

8

如果这涉及到 ASP.NET MVC (ASP.NET MVC 5 或更高版本),那么只是想展示另一种可能的解决方案:

var data= JSON.parse('@Html.Raw(HttpUtility.JavaScriptStringEncode(JsonConvert.SerializeObject(Model.memberObj)))');

这允许你在JavaScript中转义并传递数据到视图。关键部分是:
HttpUtility.JavaScriptStringEncode

4

我有一个快速粗糙的函数,可以在使用MySQL插入语句之前转义文本。这可能会有所帮助:

    public static string MySqlEscape(Object usString)
    {
        if (usString is DBNull)
        {
            return "";
        }
        else
        {
            string sample = Convert.ToString(usString);
            return Regex.Replace(sample, @"[\r\n\x00\x1a\\'""]", @"\$0");
        }
    }

这对我没有用。我正在使用C#,Sqlite等。我得到的是单引号前面的反斜杠,而这不是Sqlite转义单引号的方式。 - sapbucket
@sapbucket 如注明的那样,这是针对mysql的。您可以更改它以插入正确的转义序列。 - JohnP

3
最简单的方法就是:
Server.HtmlEncode(varYourString);

0

只是让您知道,在这种情况下

string q = "John's book";
string s = s.Replace("'", "\\'");
string t = s.Replace("'", "\\\'");

s和t会显示相同的内容;

https://dotnetfiddle.net/OwGyHW


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接