String.Replace(string,string)Unicode是否对Surrogate Pairs安全?

时间:2018-05-04 18:06:36

标签: c# string unicode replace surrogate-pairs

我试图找出创建一个等同于String.Replace("oldValue","newValue");的函数的最佳方法 可以处理代理对。

我担心的是,如果字符串中有代理项对,并且字符串可能与代理项对的一部分相匹配,那么它可能会分割代理项并且数据已损坏。

所以我的高级问题是:对于Unicode和代理对,String.Replace(string oldValue, string newValue);是安全的操作吗?

如果没有,那么最好的前进道路是什么?我熟悉StringInfo类,可以将这些字符串拆分为元素等。我只是不确定在为新旧值传递字符串时如何进行替换。

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

这是安全的,因为.NET中的字符串是内部UTF-16。 Unicode代码点可以用一个或两个UTF-16代码单元表示,而.NET char就是这样一个代码单元。

当代码点由两个单位表示时,第一个单位称为高代理,第二个单位称为低代理。在这个问题的背景下重要的是代理单位属于特定范围,U + D800 - U + DFFF。此范围仅使用 来表示代理项对,此范围内的单个单位没有意义且无效。

因此,在另一个有效的utf-16字符串中,不可能有一个有效的utf-16字符串与代理对的“part”相匹配。

请注意,.NET字符串也可以表示无效的utf-16字符串。如果Replace的任何参数无效 - 那么它确实可以拆分代理对。但是 - 垃圾输入,垃圾输出,所以在特定情况下我不认为这是一个问题。