将非字母数字字符转换为Unicode,同时保留字母数字字符。

16 浏览
0 Comments

将非字母数字字符转换为Unicode,同时保留字母数字字符。

我需要将字符串中的非字母数字字符转换为它们的Unicode值,同时保留字母数字字符。在C#中有没有这样的方法可以实现?

举个例子,我需要将这个字符串:

"hello world!"

转换为:

"hello_x0020_world_x0021_"

0
0 Comments

问题的原因是,为了使字符串在XML节点名称中安全,应该使用XmlConvert.EncodeName方法进行编码。然而,需要注意的是,如果需要编码所有的非字母数字字符,就需要自己编写代码,因为该方法不会对"_"进行编码。

解决方法是,使用XmlConvert.EncodeName方法对字符串进行编码,以确保在XML节点名称中的安全性。然而,需要注意的是,该方法不会对"_"进行编码,所以如果需要对所有的非字母数字字符进行编码,需要自己编写代码。

以下是一个示例代码,演示了如何使用XmlConvert.EncodeName方法对字符串进行编码:

string input = "Hello_world!";
string encodedName = XmlConvert.EncodeName(input);
Console.WriteLine(encodedName);

运行以上代码,将得到以下输出:

"Hello_world_0021"

通过使用XmlConvert.EncodeName方法,我们可以将"Hello_world!"编码为"Hello_world_0021",从而确保了字符串在XML节点名称中的安全性。

0
0 Comments

问题的出现原因是代码存在一些问题:

1. 在字符列表中进行线性搜索,效率较低。

2. 没有处理数字字符。

3. 如果添加了数字字符,需要决定第一个字符是否可以是数字(假设可以)。

4. 代码创建了大量立即被丢弃的字符串(每个字符一个字符串)。

5. 字母数字字符仅限于ASCII字符(假设可以,如果不行可以使用Char.IsLetterOrDigit方法进行帮助)。

6. 对于纯字母数字字符串,处理过程太复杂。

解决方法如下:

1. 使用HashSet(O(1)的Contains方法)代替列表进行字符搜索。

2. 使用StringBuilder构建字符串,避免创建立即被丢弃的字符串。

3. 对于每个字符,根据是否为字母数字字符,使用builder.Append(ch)或builder.AppendFormat("_x{0:x4}_", (int)ch)。

4. 添加检查,如果字符串中没有需要转换的字符,则不执行任何操作。

最终版本如下:

private static asciiAlphaNumRx = new Regex(@"^[a-zA-Z0-9]*$");
public static HashSet asciiAlphaNum = new HashSet
       ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789");
string ReplaceNonAlphaNumLinq(string str)
{
   return asciiAlphaNumRx.IsMatch(str) ? str :
       str.Aggregate(new StringBuilder(), (builder, ch) =>
          asciiAlphaNum.Contains(ch) ? 
             builder.Append(ch) : builder.AppendFormat("_x{0:x4}_", (int)ch)            
       ).ToString();
}

另外,也可以使用正则表达式完成整个转换过程。

0