2

我正在尝试查找字符串中每个出现的 ASCII 字符并将其替换为新行。这是我到目前为止所拥有的:

public string parseText(string inTxt)
{
    //String builder based on the string passed into the method
    StringBuilder n = new StringBuilder(inTxt);
    //Convert the ASCII character we're looking for to a string
    string replaceMe = char.ConvertFromUtf32(187);
    //Replace all occurences of string with a new line
    n.Replace(replaceMe, Environment.NewLine);
    //Convert our StringBuilder to a string and output it
    return n.ToString();
}

这不会添加新行,并且字符串都保留在一行上。我不确定这里有什么问题。我也试过这个,但结果相同:

n.Replace(replaceMe, "\n");

有什么建议么?

4

2 回答 2

11

char.ConvertFromUtf32,虽然正确,但不是基于 ASCII 数值读取字符的最简单方法。(ConvertFromUtf32主要用于位于 BMP 之外的 Unicode 代码点,这会导致代理对。这不是您在英语或大多数现代语言中遇到的情况。)相反,您应该使用(char).

char c = (char)187;
string replaceMe = c.ToString();

当然,您可以在代码中将带有所需字符的字符串定义为文字:"»".

然后您Replace将简化为:

n.Replace("»", "\n");

最后,在技术层面上,ASCII 仅涵盖值在 0-127 范围内的字符。字符 187 不是 ASCII;但是,它对应»于 ISO 8859-1、Windows-1252Unicode,它们是迄今为止最流行的编码。

编辑:我刚刚测试了您的原始代码,发现它确实有效。您确定结果保留在一行上吗?调试器在单行视图中呈现字符串的方式可能存在问题:

没有换行符?

请注意,尽管显示为文字,但这些\r\n序列实际上确实代表换行符。您可以从多行显示中检查这一点(通过单击放大镜):

换行符!

于 2012-05-24T18:53:04.840 回答
0

StringBuilder.ReplaceStringBuilder用所做的更改返回一个新的。奇怪,我知道,但这应该有效:

StringBuilder replaced = n.Replace(replaceMe, Environment.NewLine);

return replaced.ToString();
于 2012-05-24T18:55:27.300 回答