【问题标题】:String whitespace replacement error when using string.join使用 string.join 时出现字符串空格替换错误
【发布时间】:2013-06-30 21:19:41
【问题描述】:

尝试使用 string.join 将字符串列表连接在一起。当我使用分隔符字符串“OR”时,空格将被替换为“+”,这会破坏我的 targetUri 字符串。下面是加入的代码。

  if (DocumentSearchListViewModel.Filter == null)
        {
            return "http://000.000.00.00:8080/value/value/search/json?terms=value%20OR%20value&target=TEST2&maxResults=5";
        }

        var targetUri = "http://000.000.00.00:8080/value/value/search/json?";

        NameValueCollection termsString = System.Web.HttpUtility.ParseQueryString(string.Empty);

        if (!string.IsNullOrWhiteSpace(DocumentSearchListViewModel.Filter.Keywords))
        {
            if (!string.IsNullOrWhiteSpace(DocumentSearchListViewModel.Filter.Author))
            {
                DocumentSearchListViewModel.Filter.Keywords += (" " + DocumentSearchListViewModel.Filter.Author);
            }

            IList<string> keywords = DocumentSearchListViewModel.Filter.Keywords.Split();

            termsString["terms"] = string.Join(" OR ", keywords);          
        }        

        targetUri += termsString.ToString();
        targetUri += "&target=TEST2&maxResults=";
        targetUri += DocumentSearchListViewModel.Filter.MaxNumberOfResults ?? "5";

        return targetUri;

我在 Google 上进行了多次搜索,但找不到任何关于 string.join 替换字符的内容。在我的调试过程中,我能够将其范围缩小到出现问题的 termsString 行。

这是我得到的字符串的一个实际示例:terms=value1+OR+value2+OR+value3

如何阻止空格被 + 字符替换?

干杯,

詹姆斯

【问题讨论】:

  • '+' 添加在 URL 中。您是否在代码的其他部分对结果进行 URL 编码?如果您设置断点并检查 string.Join 返回的值,我敢打赌它不包含任何 '+' 字符
  • 您如何使用termsString["terms"] 值?
  • 问题不在string.Join,您的关键字必须以某种方式包含+,否则之后被替换。
  • 我相信我正在对它进行 URL 编码,因为 termString["terms"] 被附加到 URL 上
  • 即使更新后的代码也不会用'+'替换空格。您在哪里看到“+”字符?一个监视变量,浏览器的地址栏?是否正在重定向到该地址?您是否在 href 属性中使用它?在所有这些情况下,“+”是空格的有效编码。你为什么要用别的东西来改变它?

标签: c# .net string namevaluecollection character-replacement


【解决方案1】:

为了在服务器端获取 URL 解码值,你应该使用:

var encoded = "terms=value1+OR+value2+OR+value3";
var decoded = System.Web.HttpUtility.UrlDecode(encoded);

@PanagiotisKanavos,关于我之前使用%20 代替空格的建议,看看这个JS:

var uri1="terms=value1%20OR%20value2%20OR%20value3";
var uri2="terms=value1+OR+value+OR+value3";
document.write(decodeURIComponent(uri1));
document.write("<br/>");
document.write(decodeURIComponent(uri2));

如果您运行它,您会发现编码在某些情况下可能很敏感。

【讨论】:

  • String.Join 不编码任何东西。当结果被编码时,用 %20 替换空格将导致对“%”进行额外的编码。此外,'+' 也是有效的空格 url 编码
  • 我知道这一点,但我从未说过,但由于没有给出使用 termsString["terms"] 值的上下文,我提出了一个可能有助于调试的建议。你怎么知道没有涉及自定义 URL 编码?
  • @PanagiotisKanavos,这就是为什么我在之前的回答版本中建议使用%20http://stackoverflow.com/a/1211249/674700(只是为了消除这种挑剔的可能性系统)。这是一个演示http://jsfiddle.net/a4TnE/
猜你喜欢
  • 2018-12-13
  • 2013-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-16
  • 2021-07-24
  • 1970-01-01
相关资源
最近更新 更多