2

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

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

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

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

谢谢您的帮助!

4

1 回答 1

2

这是安全的,因为 .NET 中的字符串在内部是 UTF-16。Unicode 代码点可以由一到两个 UTF-16 代码单元表示,.NETchar就是这样一种代码单元。

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

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

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

于 2018-05-04T20:03:43.923 回答