我发现很多帖子都在回答类似的问题(例如“如何用 /
替换 \
”或“如何替换 \\
” by \
”。我理解所有这些,但没有一个能解决我的特殊问题。这里是:
我正在从注册表中读取路径字符串,其中包含“///
”而不是“\
”(易于替换),但也包含“/u00xy
"用于 unicode 字符。为了使用正确的 unicode 字符成功解析字符串,我必须将 /
替换为 single \
。但是每一种可能的方式(string.replace
或 regex.replace
)都会导致“\\u00xy
”而不是“\u00xy
“!
或者,我收到类似“Unrecognized escape sequence
”的错误。例如:
str.Replace("/u00", @"\u00") // results in "\\u00"
同时:
str.Replace("/u00", "\u00") // gives an error.
我没主意了!
最佳答案
我相信这样的事情应该适合你:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Globalization;
namespace Test
{
public class Program
{
public static void Main(string[] args)
{
Console.WriteLine(ConvertUnicodeEscapes("aa/u00C4bb/u00C4cc/u00C4dd/u00C4ee")); // prints aaÄbbÄccÄddÄee
}
private static Regex r = new Regex("/u([0-9A-F]{4})");
private static string ConvertUnicodeEscapes(string input)
{
return r.Replace(input, m => {
int code = int.Parse(m.Groups[1].Value, NumberStyles.HexNumber);
return char.ConvertFromUtf32(code).ToString();
} );
}
}
}
正如 Jon 所指出的,这不仅仅是用单个“\”替换“/”。你不能真的那样做,因为 '\' 是转义字符。首先,我们必须匹配组“/uXXXX”。然后我们将字符串的十六进制部分(XXXX)转换为 utf32(即 unicode)中的整数。最终得到那个utf32编码对应的字符。
关于C#:用 *single*\替换 single/,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13236770/